@opendatalabs/personal-server-ts-core 0.0.1-canary.00328bf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/index.d.ts +408 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +1257 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/raw-envelope.d.ts +3 -0
- package/dist/api/raw-envelope.d.ts.map +1 -0
- package/dist/api/raw-envelope.js +215 -0
- package/dist/api/raw-envelope.js.map +1 -0
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/request.d.ts +28 -0
- package/dist/auth/request.d.ts.map +1 -0
- package/dist/auth/request.js +106 -0
- package/dist/auth/request.js.map +1 -0
- package/dist/client.d.ts +233 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +243 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +12 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +12 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/paths.d.ts +9 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +14 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/contracts/access-logs.d.ts +8 -0
- package/dist/contracts/access-logs.d.ts.map +1 -0
- package/dist/contracts/access-logs.js +7 -0
- package/dist/contracts/access-logs.js.map +1 -0
- package/dist/contracts/auth-device.d.ts +70 -0
- package/dist/contracts/auth-device.d.ts.map +1 -0
- package/dist/contracts/auth-device.js +163 -0
- package/dist/contracts/auth-device.js.map +1 -0
- package/dist/contracts/binary.d.ts +66 -0
- package/dist/contracts/binary.d.ts.map +1 -0
- package/dist/contracts/binary.js +123 -0
- package/dist/contracts/binary.js.map +1 -0
- package/dist/contracts/config.d.ts +5 -0
- package/dist/contracts/config.d.ts.map +1 -0
- package/dist/contracts/config.js +30 -0
- package/dist/contracts/config.js.map +1 -0
- package/dist/contracts/data.d.ts +165 -0
- package/dist/contracts/data.d.ts.map +1 -0
- package/dist/contracts/data.js +371 -0
- package/dist/contracts/data.js.map +1 -0
- package/dist/contracts/grants.d.ts +45 -0
- package/dist/contracts/grants.d.ts.map +1 -0
- package/dist/contracts/grants.js +177 -0
- package/dist/contracts/grants.js.map +1 -0
- package/dist/contracts/http.d.ts +21 -0
- package/dist/contracts/http.d.ts.map +1 -0
- package/dist/contracts/http.js +49 -0
- package/dist/contracts/http.js.map +1 -0
- package/dist/contracts/index.d.ts +16 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/index.js +10 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/contracts/oauth.d.ts +38 -0
- package/dist/contracts/oauth.d.ts.map +1 -0
- package/dist/contracts/oauth.js +130 -0
- package/dist/contracts/oauth.js.map +1 -0
- package/dist/contracts/sync.d.ts +10 -0
- package/dist/contracts/sync.d.ts.map +1 -0
- package/dist/contracts/sync.js +35 -0
- package/dist/contracts/sync.js.map +1 -0
- package/dist/derivatives/answer-shape.d.ts +83 -0
- package/dist/derivatives/answer-shape.d.ts.map +1 -0
- package/dist/derivatives/answer-shape.js +320 -0
- package/dist/derivatives/answer-shape.js.map +1 -0
- package/dist/derivatives/api.d.ts +48 -0
- package/dist/derivatives/api.d.ts.map +1 -0
- package/dist/derivatives/api.js +374 -0
- package/dist/derivatives/api.js.map +1 -0
- package/dist/derivatives/compute.d.ts +112 -0
- package/dist/derivatives/compute.d.ts.map +1 -0
- package/dist/derivatives/compute.js +476 -0
- package/dist/derivatives/compute.js.map +1 -0
- package/dist/derivatives/e2ee/aad.d.ts +22 -0
- package/dist/derivatives/e2ee/aad.d.ts.map +1 -0
- package/dist/derivatives/e2ee/aad.js +32 -0
- package/dist/derivatives/e2ee/aad.js.map +1 -0
- package/dist/derivatives/e2ee/attestation.d.ts +134 -0
- package/dist/derivatives/e2ee/attestation.d.ts.map +1 -0
- package/dist/derivatives/e2ee/attestation.js +248 -0
- package/dist/derivatives/e2ee/attestation.js.map +1 -0
- package/dist/derivatives/e2ee/index.d.ts +6 -0
- package/dist/derivatives/e2ee/index.d.ts.map +1 -0
- package/dist/derivatives/e2ee/index.js +6 -0
- package/dist/derivatives/e2ee/index.js.map +1 -0
- package/dist/derivatives/e2ee/jcs.d.ts +17 -0
- package/dist/derivatives/e2ee/jcs.d.ts.map +1 -0
- package/dist/derivatives/e2ee/jcs.js +55 -0
- package/dist/derivatives/e2ee/jcs.js.map +1 -0
- package/dist/derivatives/e2ee/phala.d.ts +62 -0
- package/dist/derivatives/e2ee/phala.d.ts.map +1 -0
- package/dist/derivatives/e2ee/phala.js +168 -0
- package/dist/derivatives/e2ee/phala.js.map +1 -0
- package/dist/derivatives/e2ee/suite.d.ts +56 -0
- package/dist/derivatives/e2ee/suite.d.ts.map +1 -0
- package/dist/derivatives/e2ee/suite.js +164 -0
- package/dist/derivatives/e2ee/suite.js.map +1 -0
- package/dist/derivatives/index.d.ts +11 -0
- package/dist/derivatives/index.d.ts.map +1 -0
- package/dist/derivatives/index.js +11 -0
- package/dist/derivatives/index.js.map +1 -0
- package/dist/derivatives/inference.d.ts +151 -0
- package/dist/derivatives/inference.d.ts.map +1 -0
- package/dist/derivatives/inference.js +262 -0
- package/dist/derivatives/inference.js.map +1 -0
- package/dist/derivatives/prompt.d.ts +99 -0
- package/dist/derivatives/prompt.d.ts.map +1 -0
- package/dist/derivatives/prompt.js +281 -0
- package/dist/derivatives/prompt.js.map +1 -0
- package/dist/derivatives/registration.d.ts +56 -0
- package/dist/derivatives/registration.d.ts.map +1 -0
- package/dist/derivatives/registration.js +187 -0
- package/dist/derivatives/registration.js.map +1 -0
- package/dist/derivatives/scheduler.d.ts +114 -0
- package/dist/derivatives/scheduler.d.ts.map +1 -0
- package/dist/derivatives/scheduler.js +331 -0
- package/dist/derivatives/scheduler.js.map +1 -0
- package/dist/derivatives/store.d.ts +14 -0
- package/dist/derivatives/store.d.ts.map +1 -0
- package/dist/derivatives/store.js +79 -0
- package/dist/derivatives/store.js.map +1 -0
- package/dist/derivatives/types.d.ts +102 -0
- package/dist/derivatives/types.d.ts.map +1 -0
- package/dist/derivatives/types.js +29 -0
- package/dist/derivatives/types.js.map +1 -0
- package/dist/errors/catalog.d.ts +125 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +198 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/pdpp-catalog.d.ts +36 -0
- package/dist/errors/pdpp-catalog.d.ts.map +1 -0
- package/dist/errors/pdpp-catalog.js +82 -0
- package/dist/errors/pdpp-catalog.js.map +1 -0
- package/dist/grants/index.d.ts +5 -0
- package/dist/grants/index.d.ts.map +1 -0
- package/dist/grants/index.js +6 -0
- package/dist/grants/index.js.map +1 -0
- package/dist/grants/pdpp-binding-store.d.ts +58 -0
- package/dist/grants/pdpp-binding-store.d.ts.map +1 -0
- package/dist/grants/pdpp-binding-store.js +97 -0
- package/dist/grants/pdpp-binding-store.js.map +1 -0
- package/dist/grants/pdpp-binding.d.ts +179 -0
- package/dist/grants/pdpp-binding.d.ts.map +1 -0
- package/dist/grants/pdpp-binding.js +214 -0
- package/dist/grants/pdpp-binding.js.map +1 -0
- package/dist/keys/index.d.ts +3 -0
- package/dist/keys/index.d.ts.map +1 -0
- package/dist/keys/index.js +2 -0
- package/dist/keys/index.js.map +1 -0
- package/dist/keys/public-only-account.d.ts +8 -0
- package/dist/keys/public-only-account.d.ts.map +1 -0
- package/dist/keys/public-only-account.js +21 -0
- package/dist/keys/public-only-account.js.map +1 -0
- package/dist/keys/server-account.d.ts +24 -0
- package/dist/keys/server-account.d.ts.map +1 -0
- package/dist/keys/server-account.js +2 -0
- package/dist/keys/server-account.js.map +1 -0
- package/dist/lineage/attestation.d.ts +42 -0
- package/dist/lineage/attestation.d.ts.map +1 -0
- package/dist/lineage/attestation.js +25 -0
- package/dist/lineage/attestation.js.map +1 -0
- package/dist/lineage/gateway.d.ts +105 -0
- package/dist/lineage/gateway.d.ts.map +1 -0
- package/dist/lineage/gateway.js +242 -0
- package/dist/lineage/gateway.js.map +1 -0
- package/dist/lineage/index.d.ts +5 -0
- package/dist/lineage/index.d.ts.map +1 -0
- package/dist/lineage/index.js +5 -0
- package/dist/lineage/index.js.map +1 -0
- package/dist/lineage/lineage.d.ts +141 -0
- package/dist/lineage/lineage.d.ts.map +1 -0
- package/dist/lineage/lineage.js +255 -0
- package/dist/lineage/lineage.js.map +1 -0
- package/dist/logger/index.d.ts +9 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +5 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logging/access-log.d.ts +23 -0
- package/dist/logging/access-log.d.ts.map +1 -0
- package/dist/logging/access-log.js +2 -0
- package/dist/logging/access-log.js.map +1 -0
- package/dist/logging/access-reader.d.ts +14 -0
- package/dist/logging/access-reader.d.ts.map +1 -0
- package/dist/logging/access-reader.js +2 -0
- package/dist/logging/access-reader.js.map +1 -0
- package/dist/mcp/activity.d.ts +68 -0
- package/dist/mcp/activity.d.ts.map +1 -0
- package/dist/mcp/activity.js +111 -0
- package/dist/mcp/activity.js.map +1 -0
- package/dist/mcp/builder-registration.d.ts +24 -0
- package/dist/mcp/builder-registration.d.ts.map +1 -0
- package/dist/mcp/builder-registration.js +89 -0
- package/dist/mcp/builder-registration.js.map +1 -0
- package/dist/mcp/connection-api.d.ts +201 -0
- package/dist/mcp/connection-api.d.ts.map +1 -0
- package/dist/mcp/connection-api.js +506 -0
- package/dist/mcp/connection-api.js.map +1 -0
- package/dist/mcp/grantee.d.ts +52 -0
- package/dist/mcp/grantee.d.ts.map +1 -0
- package/dist/mcp/grantee.js +91 -0
- package/dist/mcp/grantee.js.map +1 -0
- package/dist/mcp/index.d.ts +12 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +12 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/read-client.d.ts +176 -0
- package/dist/mcp/read-client.d.ts.map +1 -0
- package/dist/mcp/read-client.js +579 -0
- package/dist/mcp/read-client.js.map +1 -0
- package/dist/mcp/resources.d.ts +37 -0
- package/dist/mcp/resources.d.ts.map +1 -0
- package/dist/mcp/resources.js +114 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/search/index.d.ts +34 -0
- package/dist/mcp/search/index.d.ts.map +1 -0
- package/dist/mcp/search/index.js +156 -0
- package/dist/mcp/search/index.js.map +1 -0
- package/dist/mcp/server.d.ts +72 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +447 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/session.d.ts +160 -0
- package/dist/mcp/session.d.ts.map +1 -0
- package/dist/mcp/session.js +243 -0
- package/dist/mcp/session.js.map +1 -0
- package/dist/mcp/store.d.ts +13 -0
- package/dist/mcp/store.d.ts.map +1 -0
- package/dist/mcp/store.js +119 -0
- package/dist/mcp/store.js.map +1 -0
- package/dist/mcp/token-expiry.d.ts +38 -0
- package/dist/mcp/token-expiry.d.ts.map +1 -0
- package/dist/mcp/token-expiry.js +55 -0
- package/dist/mcp/token-expiry.js.map +1 -0
- package/dist/mcp/tools.d.ts +95 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +1381 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/mcp/types.d.ts +135 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +24 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/payment/index.d.ts +2 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +2 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/x402.d.ts +155 -0
- package/dist/payment/x402.d.ts.map +1 -0
- package/dist/payment/x402.js +402 -0
- package/dist/payment/x402.js.map +1 -0
- package/dist/pdpp/approval.d.ts +182 -0
- package/dist/pdpp/approval.d.ts.map +1 -0
- package/dist/pdpp/approval.js +337 -0
- package/dist/pdpp/approval.js.map +1 -0
- package/dist/pdpp/client-identity.d.ts +88 -0
- package/dist/pdpp/client-identity.d.ts.map +1 -0
- package/dist/pdpp/client-identity.js +183 -0
- package/dist/pdpp/client-identity.js.map +1 -0
- package/dist/pdpp/client-metadata.d.ts +95 -0
- package/dist/pdpp/client-metadata.d.ts.map +1 -0
- package/dist/pdpp/client-metadata.js +96 -0
- package/dist/pdpp/client-metadata.js.map +1 -0
- package/dist/pdpp/declaration.d.ts +118 -0
- package/dist/pdpp/declaration.d.ts.map +1 -0
- package/dist/pdpp/declaration.js +549 -0
- package/dist/pdpp/declaration.js.map +1 -0
- package/dist/pdpp/index.d.ts +35 -0
- package/dist/pdpp/index.d.ts.map +1 -0
- package/dist/pdpp/index.js +22 -0
- package/dist/pdpp/index.js.map +1 -0
- package/dist/pdpp/issuance.d.ts +91 -0
- package/dist/pdpp/issuance.d.ts.map +1 -0
- package/dist/pdpp/issuance.js +124 -0
- package/dist/pdpp/issuance.js.map +1 -0
- package/dist/pdpp/pkce.d.ts +53 -0
- package/dist/pdpp/pkce.d.ts.map +1 -0
- package/dist/pdpp/pkce.js +109 -0
- package/dist/pdpp/pkce.js.map +1 -0
- package/dist/pdpp/redirect.d.ts +60 -0
- package/dist/pdpp/redirect.d.ts.map +1 -0
- package/dist/pdpp/redirect.js +125 -0
- package/dist/pdpp/redirect.js.map +1 -0
- package/dist/pdpp/resolve.d.ts +53 -0
- package/dist/pdpp/resolve.d.ts.map +1 -0
- package/dist/pdpp/resolve.js +218 -0
- package/dist/pdpp/resolve.js.map +1 -0
- package/dist/pdpp/review.d.ts +155 -0
- package/dist/pdpp/review.d.ts.map +1 -0
- package/dist/pdpp/review.js +142 -0
- package/dist/pdpp/review.js.map +1 -0
- package/dist/pdpp/selection.d.ts +43 -0
- package/dist/pdpp/selection.d.ts.map +1 -0
- package/dist/pdpp/selection.js +211 -0
- package/dist/pdpp/selection.js.map +1 -0
- package/dist/pdpp/store.d.ts +204 -0
- package/dist/pdpp/store.d.ts.map +1 -0
- package/dist/pdpp/store.js +501 -0
- package/dist/pdpp/store.js.map +1 -0
- package/dist/pdpp/tokens.d.ts +149 -0
- package/dist/pdpp/tokens.d.ts.map +1 -0
- package/dist/pdpp/tokens.js +387 -0
- package/dist/pdpp/tokens.js.map +1 -0
- package/dist/pdpp/types.d.ts +258 -0
- package/dist/pdpp/types.d.ts.map +1 -0
- package/dist/pdpp/types.js +40 -0
- package/dist/pdpp/types.js.map +1 -0
- package/dist/pdpp-version.d.ts +28 -0
- package/dist/pdpp-version.d.ts.map +1 -0
- package/dist/pdpp-version.js +28 -0
- package/dist/pdpp-version.js.map +1 -0
- package/dist/policy/data-read.d.ts +56 -0
- package/dist/policy/data-read.d.ts.map +1 -0
- package/dist/policy/data-read.js +176 -0
- package/dist/policy/data-read.js.map +1 -0
- package/dist/policy/data-write.d.ts +69 -0
- package/dist/policy/data-write.d.ts.map +1 -0
- package/dist/policy/data-write.js +131 -0
- package/dist/policy/data-write.js.map +1 -0
- package/dist/policy/index.d.ts +4 -0
- package/dist/policy/index.d.ts.map +1 -0
- package/dist/policy/index.js +4 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/signed-artifacts.d.ts +17 -0
- package/dist/policy/signed-artifacts.d.ts.map +1 -0
- package/dist/policy/signed-artifacts.js +110 -0
- package/dist/policy/signed-artifacts.js.map +1 -0
- package/dist/ports/index.d.ts +243 -0
- package/dist/ports/index.d.ts.map +1 -0
- package/dist/ports/index.js +7 -0
- package/dist/ports/index.js.map +1 -0
- package/dist/ports/pdpp-auth.d.ts +103 -0
- package/dist/ports/pdpp-auth.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.js +37 -0
- package/dist/ports/pdpp-auth.js.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts +9 -0
- package/dist/ports/pdpp-auth.test-utils.d.ts.map +1 -0
- package/dist/ports/pdpp-auth.test-utils.js +18 -0
- package/dist/ports/pdpp-auth.test-utils.js.map +1 -0
- package/dist/schemas/server-config.d.ts +190 -0
- package/dist/schemas/server-config.d.ts.map +1 -0
- package/dist/schemas/server-config.js +282 -0
- package/dist/schemas/server-config.js.map +1 -0
- package/dist/signing/index.d.ts +3 -0
- package/dist/signing/index.d.ts.map +1 -0
- package/dist/signing/index.js +3 -0
- package/dist/signing/index.js.map +1 -0
- package/dist/signing/request-signer.d.ts +20 -0
- package/dist/signing/request-signer.d.ts.map +1 -0
- package/dist/signing/request-signer.js +23 -0
- package/dist/signing/request-signer.js.map +1 -0
- package/dist/signing/signer.d.ts +40 -0
- package/dist/signing/signer.d.ts.map +1 -0
- package/dist/signing/signer.js +56 -0
- package/dist/signing/signer.js.map +1 -0
- package/dist/storage/adapters/index.d.ts +4 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +3 -0
- package/dist/storage/adapters/index.js.map +1 -0
- package/dist/storage/adapters/interface.d.ts +57 -0
- package/dist/storage/adapters/interface.d.ts.map +1 -0
- package/dist/storage/adapters/interface.js +2 -0
- package/dist/storage/adapters/interface.js.map +1 -0
- package/dist/storage/adapters/sdk.d.ts +23 -0
- package/dist/storage/adapters/sdk.d.ts.map +1 -0
- package/dist/storage/adapters/sdk.js +73 -0
- package/dist/storage/adapters/sdk.js.map +1 -0
- package/dist/storage/adapters/vana.d.ts +12 -0
- package/dist/storage/adapters/vana.d.ts.map +1 -0
- package/dist/storage/adapters/vana.js +111 -0
- package/dist/storage/adapters/vana.js.map +1 -0
- package/dist/storage/blocks/build.d.ts +20 -0
- package/dist/storage/blocks/build.d.ts.map +1 -0
- package/dist/storage/blocks/build.js +378 -0
- package/dist/storage/blocks/build.js.map +1 -0
- package/dist/storage/blocks/cursor.d.ts +33 -0
- package/dist/storage/blocks/cursor.d.ts.map +1 -0
- package/dist/storage/blocks/cursor.js +142 -0
- package/dist/storage/blocks/cursor.js.map +1 -0
- package/dist/storage/blocks/errors.d.ts +6 -0
- package/dist/storage/blocks/errors.d.ts.map +1 -0
- package/dist/storage/blocks/errors.js +9 -0
- package/dist/storage/blocks/errors.js.map +1 -0
- package/dist/storage/blocks/index.d.ts +6 -0
- package/dist/storage/blocks/index.d.ts.map +1 -0
- package/dist/storage/blocks/index.js +5 -0
- package/dist/storage/blocks/index.js.map +1 -0
- package/dist/storage/blocks/select.d.ts +29 -0
- package/dist/storage/blocks/select.d.ts.map +1 -0
- package/dist/storage/blocks/select.js +120 -0
- package/dist/storage/blocks/select.js.map +1 -0
- package/dist/storage/blocks/types.d.ts +56 -0
- package/dist/storage/blocks/types.d.ts.map +1 -0
- package/dist/storage/blocks/types.js +2 -0
- package/dist/storage/blocks/types.js.map +1 -0
- package/dist/storage/hierarchy/index.d.ts +3 -0
- package/dist/storage/hierarchy/index.d.ts.map +1 -0
- package/dist/storage/hierarchy/index.js +2 -0
- package/dist/storage/hierarchy/index.js.map +1 -0
- package/dist/storage/hierarchy/manager.d.ts +9 -0
- package/dist/storage/hierarchy/manager.d.ts.map +1 -0
- package/dist/storage/hierarchy/manager.js +2 -0
- package/dist/storage/hierarchy/manager.js.map +1 -0
- package/dist/storage/hierarchy/paths.d.ts +11 -0
- package/dist/storage/hierarchy/paths.d.ts.map +1 -0
- package/dist/storage/hierarchy/paths.js +43 -0
- package/dist/storage/hierarchy/paths.js.map +1 -0
- package/dist/storage/index/index.d.ts +3 -0
- package/dist/storage/index/index.d.ts.map +1 -0
- package/dist/storage/index/index.js +2 -0
- package/dist/storage/index/index.js.map +1 -0
- package/dist/storage/index/manager.d.ts +63 -0
- package/dist/storage/index/manager.d.ts.map +1 -0
- package/dist/storage/index/manager.js +2 -0
- package/dist/storage/index/manager.js.map +1 -0
- package/dist/storage/index/schema.d.ts +2 -0
- package/dist/storage/index/schema.d.ts.map +1 -0
- package/dist/storage/index/schema.js +2 -0
- package/dist/storage/index/schema.js.map +1 -0
- package/dist/storage/index/types.d.ts +37 -0
- package/dist/storage/index/types.d.ts.map +1 -0
- package/dist/storage/index/types.js +2 -0
- package/dist/storage/index/types.js.map +1 -0
- package/dist/storage/pdpp-records/cursor.d.ts +27 -0
- package/dist/storage/pdpp-records/cursor.d.ts.map +1 -0
- package/dist/storage/pdpp-records/cursor.js +49 -0
- package/dist/storage/pdpp-records/cursor.js.map +1 -0
- package/dist/storage/pdpp-records/enforcement.d.ts +37 -0
- package/dist/storage/pdpp-records/enforcement.d.ts.map +1 -0
- package/dist/storage/pdpp-records/enforcement.js +79 -0
- package/dist/storage/pdpp-records/enforcement.js.map +1 -0
- package/dist/storage/pdpp-records/index.d.ts +8 -0
- package/dist/storage/pdpp-records/index.d.ts.map +1 -0
- package/dist/storage/pdpp-records/index.js +8 -0
- package/dist/storage/pdpp-records/index.js.map +1 -0
- package/dist/storage/pdpp-records/interface.d.ts +49 -0
- package/dist/storage/pdpp-records/interface.d.ts.map +1 -0
- package/dist/storage/pdpp-records/interface.js +2 -0
- package/dist/storage/pdpp-records/interface.js.map +1 -0
- package/dist/storage/pdpp-records/memory-store.d.ts +9 -0
- package/dist/storage/pdpp-records/memory-store.d.ts.map +1 -0
- package/dist/storage/pdpp-records/memory-store.js +0 -0
- package/dist/storage/pdpp-records/memory-store.js.map +1 -0
- package/dist/storage/pdpp-records/record-key.d.ts +52 -0
- package/dist/storage/pdpp-records/record-key.d.ts.map +1 -0
- package/dist/storage/pdpp-records/record-key.js +97 -0
- package/dist/storage/pdpp-records/record-key.js.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts +43 -0
- package/dist/storage/pdpp-records/stream-declaration.d.ts.map +1 -0
- package/dist/storage/pdpp-records/stream-declaration.js +17 -0
- package/dist/storage/pdpp-records/stream-declaration.js.map +1 -0
- package/dist/storage/pdpp-records/types.d.ts +93 -0
- package/dist/storage/pdpp-records/types.d.ts.map +1 -0
- package/dist/storage/pdpp-records/types.js +17 -0
- package/dist/storage/pdpp-records/types.js.map +1 -0
- package/dist/storage/preview.d.ts +12 -0
- package/dist/storage/preview.d.ts.map +1 -0
- package/dist/storage/preview.js +239 -0
- package/dist/storage/preview.js.map +1 -0
- package/dist/sync/cursor.d.ts +10 -0
- package/dist/sync/cursor.d.ts.map +1 -0
- package/dist/sync/cursor.js +2 -0
- package/dist/sync/cursor.js.map +1 -0
- package/dist/sync/data-point-feed.d.ts +35 -0
- package/dist/sync/data-point-feed.d.ts.map +1 -0
- package/dist/sync/data-point-feed.js +122 -0
- package/dist/sync/data-point-feed.js.map +1 -0
- package/dist/sync/data-point-id.d.ts +7 -0
- package/dist/sync/data-point-id.d.ts.map +1 -0
- package/dist/sync/data-point-id.js +16 -0
- package/dist/sync/data-point-id.js.map +1 -0
- package/dist/sync/delete-data-port.d.ts +50 -0
- package/dist/sync/delete-data-port.d.ts.map +1 -0
- package/dist/sync/delete-data-port.js +244 -0
- package/dist/sync/delete-data-port.js.map +1 -0
- package/dist/sync/engine/sync-manager.d.ts +58 -0
- package/dist/sync/engine/sync-manager.d.ts.map +1 -0
- package/dist/sync/engine/sync-manager.js +285 -0
- package/dist/sync/engine/sync-manager.js.map +1 -0
- package/dist/sync/index.d.ts +15 -0
- package/dist/sync/index.d.ts.map +1 -0
- package/dist/sync/index.js +14 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/issues.d.ts +55 -0
- package/dist/sync/issues.d.ts.map +1 -0
- package/dist/sync/issues.js +168 -0
- package/dist/sync/issues.js.map +1 -0
- package/dist/sync/pdpp-import.d.ts +192 -0
- package/dist/sync/pdpp-import.d.ts.map +1 -0
- package/dist/sync/pdpp-import.js +422 -0
- package/dist/sync/pdpp-import.js.map +1 -0
- package/dist/sync/pending-blob-deletions.d.ts +29 -0
- package/dist/sync/pending-blob-deletions.d.ts.map +1 -0
- package/dist/sync/pending-blob-deletions.js +116 -0
- package/dist/sync/pending-blob-deletions.js.map +1 -0
- package/dist/sync/retry-memory.d.ts +33 -0
- package/dist/sync/retry-memory.d.ts.map +1 -0
- package/dist/sync/retry-memory.js +68 -0
- package/dist/sync/retry-memory.js.map +1 -0
- package/dist/sync/scope-deletions.d.ts +155 -0
- package/dist/sync/scope-deletions.d.ts.map +1 -0
- package/dist/sync/scope-deletions.js +225 -0
- package/dist/sync/scope-deletions.js.map +1 -0
- package/dist/sync/tombstone.d.ts +27 -0
- package/dist/sync/tombstone.d.ts.map +1 -0
- package/dist/sync/tombstone.js +28 -0
- package/dist/sync/tombstone.js.map +1 -0
- package/dist/sync/types.d.ts +27 -0
- package/dist/sync/types.d.ts.map +1 -0
- package/dist/sync/types.js +2 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/workers/delete.d.ts +163 -0
- package/dist/sync/workers/delete.d.ts.map +1 -0
- package/dist/sync/workers/delete.js +474 -0
- package/dist/sync/workers/delete.js.map +1 -0
- package/dist/sync/workers/download.d.ts +159 -0
- package/dist/sync/workers/download.d.ts.map +1 -0
- package/dist/sync/workers/download.js +731 -0
- package/dist/sync/workers/download.js.map +1 -0
- package/dist/sync/workers/upload.d.ts +98 -0
- package/dist/sync/workers/upload.d.ts.map +1 -0
- package/dist/sync/workers/upload.js +412 -0
- package/dist/sync/workers/upload.js.map +1 -0
- package/dist/test-utils/e2ee-fixtures.d.ts +94 -0
- package/dist/test-utils/e2ee-fixtures.d.ts.map +1 -0
- package/dist/test-utils/e2ee-fixtures.js +116 -0
- package/dist/test-utils/e2ee-fixtures.js.map +1 -0
- package/dist/test-utils/e2ee-gateway.d.ts +61 -0
- package/dist/test-utils/e2ee-gateway.d.ts.map +1 -0
- package/dist/test-utils/e2ee-gateway.js +248 -0
- package/dist/test-utils/e2ee-gateway.js.map +1 -0
- package/dist/test-utils/index.d.ts +5 -0
- package/dist/test-utils/index.d.ts.map +1 -0
- package/dist/test-utils/index.js +5 -0
- package/dist/test-utils/index.js.map +1 -0
- package/dist/test-utils/memory-storage.d.ts +12 -0
- package/dist/test-utils/memory-storage.d.ts.map +1 -0
- package/dist/test-utils/memory-storage.js +146 -0
- package/dist/test-utils/memory-storage.js.map +1 -0
- package/dist/test-utils/wallet.d.ts +47 -0
- package/dist/test-utils/wallet.d.ts.map +1 -0
- package/dist/test-utils/wallet.js +98 -0
- package/dist/test-utils/wallet.js.map +1 -0
- package/dist/write/attribution.d.ts +185 -0
- package/dist/write/attribution.d.ts.map +1 -0
- package/dist/write/attribution.js +450 -0
- package/dist/write/attribution.js.map +1 -0
- package/dist/write/authorize.d.ts +77 -0
- package/dist/write/authorize.d.ts.map +1 -0
- package/dist/write/authorize.js +109 -0
- package/dist/write/authorize.js.map +1 -0
- package/dist/write/index.d.ts +5 -0
- package/dist/write/index.d.ts.map +1 -0
- package/dist/write/index.js +5 -0
- package/dist/write/index.js.map +1 -0
- package/dist/write/route.d.ts +61 -0
- package/dist/write/route.d.ts.map +1 -0
- package/dist/write/route.js +132 -0
- package/dist/write/route.js.map +1 -0
- package/dist/write/session.d.ts +96 -0
- package/dist/write/session.d.ts.map +1 -0
- package/dist/write/session.js +136 -0
- package/dist/write/session.js.map +1 -0
- package/package.json +175 -0
|
@@ -0,0 +1,731 @@
|
|
|
1
|
+
import { DataFileEnvelopeSchema, decryptWithPassword, deriveScopeKey, } from "@opendatalabs/vana-sdk/browser";
|
|
2
|
+
import { feedFromGatewayClient } from "../data-point-feed.js";
|
|
3
|
+
import { deletionTimestamp, isEntryCoveredByTombstone, tombstoneVersion, } from "../scope-deletions.js";
|
|
4
|
+
import { buildDataBlocksAsync } from "../../storage/blocks/build.js";
|
|
5
|
+
import { classifySyncFailure, inferPayloadKind, } from "../issues.js";
|
|
6
|
+
import { downloadRetryKey } from "../retry-memory.js";
|
|
7
|
+
import { readStoredLineage } from "../../lineage/lineage.js";
|
|
8
|
+
import { isPermanentRejection } from "../pdpp-import.js";
|
|
9
|
+
/**
|
|
10
|
+
* Hydrate exact owner scopes without listing the registry or changing the
|
|
11
|
+
* incremental cursor. This is the cold-start fast path; downloadAll remains
|
|
12
|
+
* responsible for the complete registry reconciliation.
|
|
13
|
+
*/
|
|
14
|
+
export async function downloadScopes(deps, scopes, options = {}) {
|
|
15
|
+
const feed = deps.dataPointFeed ?? feedFromGatewayClient(deps.gateway);
|
|
16
|
+
const results = [];
|
|
17
|
+
for (const scope of scopes) {
|
|
18
|
+
const dataPoint = await feed.getDataPoint({
|
|
19
|
+
ownerAddress: deps.serverOwner,
|
|
20
|
+
scope,
|
|
21
|
+
});
|
|
22
|
+
if (!dataPoint) {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
const deletedAt = deletionTimestamp(dataPoint);
|
|
26
|
+
if (deletedAt !== null) {
|
|
27
|
+
deps.scopeDeletions?.markDeleted(scope, {
|
|
28
|
+
deletedAt,
|
|
29
|
+
version: tombstoneVersion(dataPoint),
|
|
30
|
+
});
|
|
31
|
+
await reconcileDeletedDataPoint(deps, dataPoint, deletedAt);
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
deps.scopeDeletions?.markLive(scope);
|
|
35
|
+
const retryKey = downloadRetryKey(dataPoint);
|
|
36
|
+
const decision = options.retryMemory?.decide(retryKey) ?? "attempt";
|
|
37
|
+
if (decision !== "attempt") {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const result = await downloadOne(deps, dataPoint);
|
|
42
|
+
options.retryMemory?.recordSuccess(retryKey);
|
|
43
|
+
if (result) {
|
|
44
|
+
results.push(result);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const metadata = getSyncFailureMetadata(err);
|
|
49
|
+
const classified = classifySyncFailure({
|
|
50
|
+
error: err,
|
|
51
|
+
fileId: dataPoint.id,
|
|
52
|
+
syncRunId: "scope-hydration",
|
|
53
|
+
stage: metadata.stage,
|
|
54
|
+
scope: metadata.scope ?? dataPoint.scope,
|
|
55
|
+
payloadKind: metadata.payloadKind,
|
|
56
|
+
encryptedSizeBytes: metadata.encryptedSizeBytes,
|
|
57
|
+
});
|
|
58
|
+
options.retryMemory?.recordFailure(retryKey, classified.issue.retryable);
|
|
59
|
+
if (classified.issue.retryable) {
|
|
60
|
+
throw err;
|
|
61
|
+
}
|
|
62
|
+
deps.logger.warn({
|
|
63
|
+
dataPointId: dataPoint.id,
|
|
64
|
+
scope: classified.issue.scope,
|
|
65
|
+
stage: classified.issue.stage,
|
|
66
|
+
payloadKind: classified.issue.payloadKind,
|
|
67
|
+
encryptedSizeBytes: classified.issue.encryptedSizeBytes,
|
|
68
|
+
errorClass: classified.issue.errorClass,
|
|
69
|
+
message: classified.issue.message,
|
|
70
|
+
}, "Quarantined corrupt synced data point");
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return results;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Download and process a single DPv2 data point from the storage backend:
|
|
77
|
+
* 1. Check dedup: skip if dataPointId already in local index
|
|
78
|
+
* 2. Reconstruct the blob URL from (scope, expectedVersion) — DataPointRecords
|
|
79
|
+
* carry no URL, so we rebuild the version-keyed `{scope}/{version}` key the
|
|
80
|
+
* upload worker wrote under and resolve it via storageAdapter.urlForKey
|
|
81
|
+
* 3. Download the OpenPGP encrypted binary from storage
|
|
82
|
+
* 4. Derive scope key from master key → hex-encode as OpenPGP password
|
|
83
|
+
* (scope comes straight off the record — no schema lookup needed)
|
|
84
|
+
* 5. Decrypt with OpenPGP password-based decryption → plaintext JSON
|
|
85
|
+
* 6. Parse as DataFileEnvelope (validate)
|
|
86
|
+
* 7. Write to local filesystem + bounded block sidecars
|
|
87
|
+
* 8. Insert into local index (with dataPointId + version)
|
|
88
|
+
*/
|
|
89
|
+
export async function downloadOne(deps, record) {
|
|
90
|
+
const { storage, storageAdapter, masterKey, logger, diagnostics } = deps;
|
|
91
|
+
const ctx = { dataPointId: record.id, schemaId: null };
|
|
92
|
+
// 1. Check dedup: skip if dataPointId already in local index
|
|
93
|
+
const existing = storage.findByDataPointId(record.id);
|
|
94
|
+
if (existing) {
|
|
95
|
+
const repairResult = await repairMissingBlockSidecars(storage, logger, { dataPointId: record.id, schemaId: existing.schemaId }, existing, diagnostics);
|
|
96
|
+
if (repairResult === "missing-envelope") {
|
|
97
|
+
logger.warn({
|
|
98
|
+
dataPointId: record.id,
|
|
99
|
+
scope: existing.scope,
|
|
100
|
+
collectedAt: existing.collectedAt,
|
|
101
|
+
}, "Local index entry was missing its envelope; re-downloading data point");
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
// Already indexed by a previous cycle. The legacy path is done, but the
|
|
105
|
+
// PDPP import may not be: it runs after indexing, so it can have failed,
|
|
106
|
+
// or PDPP may not have been mounted yet when this point first arrived.
|
|
107
|
+
// Because the local index is itself the dedup key, returning here
|
|
108
|
+
// without retrying is what strands such an envelope permanently — no
|
|
109
|
+
// later sync would ever look at it again.
|
|
110
|
+
await retryPdppImportFromLocal(deps, existing);
|
|
111
|
+
logger.debug({ dataPointId: record.id }, "Data point already in index, skipping");
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 2. Reconstruct the version-keyed storage URL.
|
|
116
|
+
const storageKey = `${record.scope}/${record.expectedVersion}`;
|
|
117
|
+
const url = storageAdapter.urlForKey(storageKey);
|
|
118
|
+
// 3. Download OpenPGP encrypted binary from storage backend. A download
|
|
119
|
+
// failure throws and blocks the cursor (correct: a transient error retries
|
|
120
|
+
// next cycle rather than risk a silent gap). Stamp the stage so the
|
|
121
|
+
// classifier can tell a deterministic 404 (quarantine, never retry) from a
|
|
122
|
+
// transient storage error — without it the failure infers stage "unknown"
|
|
123
|
+
// and every 404 is retried forever.
|
|
124
|
+
diagnostics?.onDownloadStart(record.id);
|
|
125
|
+
let encrypted;
|
|
126
|
+
try {
|
|
127
|
+
encrypted = await storageAdapter.download(url);
|
|
128
|
+
}
|
|
129
|
+
catch (err) {
|
|
130
|
+
const detail = err.message;
|
|
131
|
+
diagnostics?.onDownloadError(record.id, detail);
|
|
132
|
+
throw withSyncFailureMetadata(err, {
|
|
133
|
+
stage: "download",
|
|
134
|
+
scope: record.scope,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
diagnostics?.onDownloadEnd(record.id, record.scope);
|
|
138
|
+
// 4. Derive scope key → hex-encode as OpenPGP password (scope off the record)
|
|
139
|
+
const scopeKey = deriveScopeKey(masterKey, record.scope);
|
|
140
|
+
const scopeKeyHex = uint8ToHex(scopeKey);
|
|
141
|
+
// 5. Decrypt with OpenPGP password-based decryption
|
|
142
|
+
diagnostics?.onDecryptStart(record.id, record.scope);
|
|
143
|
+
let plaintext;
|
|
144
|
+
try {
|
|
145
|
+
plaintext = await decryptWithPassword(encrypted, scopeKeyHex);
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
const payloadKind = inferPayloadKind(encrypted);
|
|
149
|
+
const encryptedSizeBytes = encrypted.byteLength;
|
|
150
|
+
const detail = [
|
|
151
|
+
err.message,
|
|
152
|
+
`payloadKind=${payloadKind}`,
|
|
153
|
+
`encryptedSizeBytes=${encryptedSizeBytes}`,
|
|
154
|
+
].join("; ");
|
|
155
|
+
diagnostics?.onDecryptError(record.id, record.scope, detail);
|
|
156
|
+
throw withSyncFailureMetadata(err, {
|
|
157
|
+
scope: record.scope,
|
|
158
|
+
payloadKind,
|
|
159
|
+
encryptedSizeBytes,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
finally {
|
|
163
|
+
// Decrypt returns an independent plaintext buffer. Clear the encrypted
|
|
164
|
+
// payload immediately instead of retaining a second large record until
|
|
165
|
+
// the rest of indexing completes or the next garbage collection.
|
|
166
|
+
encrypted.fill(0);
|
|
167
|
+
}
|
|
168
|
+
// 6. Parse as DataFileEnvelope (validate)
|
|
169
|
+
let envelope;
|
|
170
|
+
try {
|
|
171
|
+
const raw = JSON.parse(new TextDecoder().decode(plaintext));
|
|
172
|
+
envelope = DataFileEnvelopeSchema.parse(raw);
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
const detail = err.message;
|
|
176
|
+
diagnostics?.onDecryptError(record.id, record.scope, detail);
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
ctx.schemaId = envelope.schemaId ?? null;
|
|
180
|
+
diagnostics?.onDecryptEnd(record.id, envelope.scope);
|
|
181
|
+
const existingByVersion = storage.findEntry({
|
|
182
|
+
scope: envelope.scope,
|
|
183
|
+
at: envelope.collectedAt,
|
|
184
|
+
});
|
|
185
|
+
if (existingByVersion !== undefined &&
|
|
186
|
+
existingByVersion.collectedAt === envelope.collectedAt) {
|
|
187
|
+
if (existingByVersion.dataPointId !== record.id) {
|
|
188
|
+
await storage.updateDataPointId(existingByVersion.path, record.id);
|
|
189
|
+
}
|
|
190
|
+
const repairResult = await repairMissingBlockSidecars(storage, logger, {
|
|
191
|
+
dataPointId: record.id,
|
|
192
|
+
schemaId: existingByVersion.schemaId ?? ctx.schemaId,
|
|
193
|
+
}, existingByVersion, diagnostics);
|
|
194
|
+
if (repairResult !== "missing-envelope") {
|
|
195
|
+
// Same version already stored locally. The envelope is decrypted and in
|
|
196
|
+
// hand, so offer it to the importer directly — no local re-read needed.
|
|
197
|
+
// Same stranding risk as the dataPointId dedup above.
|
|
198
|
+
importIntoPdpp(deps, envelope, record.id);
|
|
199
|
+
logger.debug({
|
|
200
|
+
dataPointId: record.id,
|
|
201
|
+
scope: envelope.scope,
|
|
202
|
+
collectedAt: envelope.collectedAt,
|
|
203
|
+
}, "Data version already exists locally, skipping");
|
|
204
|
+
return null;
|
|
205
|
+
}
|
|
206
|
+
logger.warn({
|
|
207
|
+
dataPointId: record.id,
|
|
208
|
+
scope: envelope.scope,
|
|
209
|
+
collectedAt: envelope.collectedAt,
|
|
210
|
+
}, "Local version entry was missing its envelope; rewriting downloaded file");
|
|
211
|
+
}
|
|
212
|
+
// 7. Write to local storage + bounded block sidecars
|
|
213
|
+
diagnostics?.onIndexStart(record.id, envelope.scope);
|
|
214
|
+
let relativePath;
|
|
215
|
+
let sizeBytes;
|
|
216
|
+
try {
|
|
217
|
+
({ relativePath, sizeBytes } = await storage.writeEnvelope(envelope));
|
|
218
|
+
await writeBlockSidecars(storage, envelope, logger, ctx, relativePath, diagnostics);
|
|
219
|
+
}
|
|
220
|
+
catch (err) {
|
|
221
|
+
const detail = err.message;
|
|
222
|
+
diagnostics?.onIndexError(record.id, envelope.scope, detail);
|
|
223
|
+
throw err;
|
|
224
|
+
}
|
|
225
|
+
// 8. Insert into local index (with dataPointId + version)
|
|
226
|
+
try {
|
|
227
|
+
await storage.insertEntry({
|
|
228
|
+
fileId: null,
|
|
229
|
+
schemaId: ctx.schemaId,
|
|
230
|
+
path: relativePath,
|
|
231
|
+
scope: envelope.scope,
|
|
232
|
+
collectedAt: envelope.collectedAt,
|
|
233
|
+
sizeBytes,
|
|
234
|
+
version: Number(record.expectedVersion),
|
|
235
|
+
dataPointId: record.id,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
const detail = err.message;
|
|
240
|
+
diagnostics?.onIndexError(record.id, envelope.scope, detail);
|
|
241
|
+
throw err;
|
|
242
|
+
}
|
|
243
|
+
diagnostics?.onIndexEnd(record.id, envelope.scope);
|
|
244
|
+
logger.info({ dataPointId: record.id, scope: envelope.scope, path: relativePath }, "Downloaded and indexed data point");
|
|
245
|
+
importIntoPdpp(deps, envelope, record.id);
|
|
246
|
+
if (deps.onDataPointIndexed) {
|
|
247
|
+
try {
|
|
248
|
+
let lineageSources;
|
|
249
|
+
try {
|
|
250
|
+
lineageSources = readStoredLineage(envelope.data)?.sources;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// A malformed $lineage is the upload worker's problem; the hook
|
|
254
|
+
// still learns about the new version.
|
|
255
|
+
}
|
|
256
|
+
deps.onDataPointIndexed({
|
|
257
|
+
scope: envelope.scope,
|
|
258
|
+
dataPointId: record.id,
|
|
259
|
+
version: Number(record.expectedVersion),
|
|
260
|
+
collectedAt: envelope.collectedAt,
|
|
261
|
+
lineageSources,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
logger.warn({ scope: envelope.scope, error: err.message }, "onDataPointIndexed hook failed; data point already indexed");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
dataPointId: record.id,
|
|
270
|
+
scope: envelope.scope,
|
|
271
|
+
collectedAt: envelope.collectedAt,
|
|
272
|
+
path: relativePath,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Poll Gateway for the owner's data points since the stored cursor, download
|
|
277
|
+
* each, and advance the cursor only when the page fully succeeds.
|
|
278
|
+
*/
|
|
279
|
+
export async function downloadAll(deps, options = {}) {
|
|
280
|
+
const { gateway, cursor, serverOwner, logger } = deps;
|
|
281
|
+
const syncRunId = createSyncRunId();
|
|
282
|
+
const repairSummary = await repairLocalMissingBlockSidecars(deps);
|
|
283
|
+
// 1. Read cursor (opaque pagination cursor persisted across runs)
|
|
284
|
+
const lastCursor = options.fullReconcile || repairSummary.missingEnvelopeEntries > 0
|
|
285
|
+
? null
|
|
286
|
+
: await cursor.read();
|
|
287
|
+
if (options.fullReconcile) {
|
|
288
|
+
logger.info("Running full registry reconciliation to repair any missing local scope records");
|
|
289
|
+
}
|
|
290
|
+
if (repairSummary.missingEnvelopeEntries > 0) {
|
|
291
|
+
logger.warn({ missingEnvelopeEntries: repairSummary.missingEnvelopeEntries }, "Resetting this sync listing to repair stale local index entries");
|
|
292
|
+
}
|
|
293
|
+
if (options.fullReconcile || repairSummary.missingEnvelopeEntries > 0) {
|
|
294
|
+
// An EXPLICIT listing restart (full reconcile, or the repair path above)
|
|
295
|
+
// exists to re-fetch — give transient failures a fresh attempt budget so
|
|
296
|
+
// it can; 404s stay dead. Note `lastCursor === null` alone is NOT a
|
|
297
|
+
// reset signal: single-page listings never advance the cursor, so null
|
|
298
|
+
// is their steady state and clearing on it would erase the backoff
|
|
299
|
+
// memory every cycle.
|
|
300
|
+
options.retryMemory?.onListingReset();
|
|
301
|
+
}
|
|
302
|
+
// 2. Poll gateway for the owner's data points, tombstones included: a
|
|
303
|
+
// deletion made on another replica must reach this one or its local copy
|
|
304
|
+
// would be re-uploaded and resurrect the point.
|
|
305
|
+
const feed = deps.dataPointFeed ?? feedFromGatewayClient(gateway);
|
|
306
|
+
const { dataPoints, cursor: nextCursor } = await feed.listDataPointsByOwner(serverOwner, lastCursor, { includeDeleted: true });
|
|
307
|
+
// Feed the read-side deletion memory before any per-record work so a
|
|
308
|
+
// tombstone is refused by reads even if its local reconcile below fails.
|
|
309
|
+
// Only a listing with no further pages proves the memory complete: a
|
|
310
|
+
// multi-page backlog leaves it "stale" and reads fall back to lookups. A
|
|
311
|
+
// listing from no cursor covered the whole registry (`full`), which is
|
|
312
|
+
// what re-validates remembered tombstones; an incremental pass does not.
|
|
313
|
+
if (deps.scopeDeletions) {
|
|
314
|
+
for (const dataPoint of dataPoints) {
|
|
315
|
+
const deletedAt = deletionTimestamp(dataPoint);
|
|
316
|
+
if (deletedAt !== null) {
|
|
317
|
+
deps.scopeDeletions.markDeleted(dataPoint.scope, {
|
|
318
|
+
deletedAt,
|
|
319
|
+
version: tombstoneVersion(dataPoint),
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
deps.scopeDeletions.markLive(dataPoint.scope);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
if (nextCursor === null) {
|
|
327
|
+
deps.scopeDeletions.noteFeedSynced(undefined, {
|
|
328
|
+
full: lastCursor === null,
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
const results = [];
|
|
333
|
+
let failed = false;
|
|
334
|
+
// 3. Process each data point record
|
|
335
|
+
for (const dataPoint of dataPoints) {
|
|
336
|
+
const deletedAt = deletionTimestamp(dataPoint);
|
|
337
|
+
if (deletedAt !== null) {
|
|
338
|
+
// Tombstone: never download; drop what the deletion covers locally.
|
|
339
|
+
// A failure here blocks the cursor so the tombstone is re-listed and
|
|
340
|
+
// the reconcile retried next cycle.
|
|
341
|
+
try {
|
|
342
|
+
await reconcileDeletedDataPoint(deps, dataPoint, deletedAt);
|
|
343
|
+
}
|
|
344
|
+
catch (err) {
|
|
345
|
+
logger.error({
|
|
346
|
+
dataPointId: dataPoint.id,
|
|
347
|
+
scope: dataPoint.scope,
|
|
348
|
+
error: err.message,
|
|
349
|
+
}, "Failed to reconcile deleted data point locally");
|
|
350
|
+
failed = true;
|
|
351
|
+
}
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
const retryKey = downloadRetryKey(dataPoint);
|
|
355
|
+
const decision = options.retryMemory?.decide(retryKey) ?? "attempt";
|
|
356
|
+
if (decision === "give-up") {
|
|
357
|
+
// Non-retryable failure (e.g. blob 404) or exhausted transient
|
|
358
|
+
// retries — skip without blocking the cursor so one dead record
|
|
359
|
+
// can't wedge the rest of the listing. A new registered version
|
|
360
|
+
// (different retry key) starts fresh.
|
|
361
|
+
logger.debug({ dataPointId: dataPoint.id, scope: dataPoint.scope }, "Skipping data point after exhausted download retries");
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
if (decision === "backoff") {
|
|
365
|
+
// Waiting out the backoff window. Block the cursor so the record is
|
|
366
|
+
// still listed when the window expires.
|
|
367
|
+
failed = true;
|
|
368
|
+
continue;
|
|
369
|
+
}
|
|
370
|
+
try {
|
|
371
|
+
const result = await downloadOne(deps, dataPoint);
|
|
372
|
+
options.retryMemory?.recordSuccess(retryKey);
|
|
373
|
+
if (result) {
|
|
374
|
+
results.push(result);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
const metadata = getSyncFailureMetadata(err);
|
|
379
|
+
const classified = classifySyncFailure({
|
|
380
|
+
error: err,
|
|
381
|
+
fileId: dataPoint.id,
|
|
382
|
+
syncRunId,
|
|
383
|
+
stage: metadata.stage,
|
|
384
|
+
scope: metadata.scope ?? dataPoint.scope,
|
|
385
|
+
payloadKind: metadata.payloadKind,
|
|
386
|
+
encryptedSizeBytes: metadata.encryptedSizeBytes,
|
|
387
|
+
});
|
|
388
|
+
options.retryMemory?.recordFailure(retryKey, classified.issue.retryable);
|
|
389
|
+
if (!classified.issue.retryable) {
|
|
390
|
+
logger.warn({
|
|
391
|
+
dataPointId: dataPoint.id,
|
|
392
|
+
scope: classified.issue.scope,
|
|
393
|
+
stage: classified.issue.stage,
|
|
394
|
+
payloadKind: classified.issue.payloadKind,
|
|
395
|
+
encryptedSizeBytes: classified.issue.encryptedSizeBytes,
|
|
396
|
+
errorClass: classified.issue.errorClass,
|
|
397
|
+
message: classified.issue.message,
|
|
398
|
+
}, "Quarantined corrupt synced data point");
|
|
399
|
+
continue;
|
|
400
|
+
}
|
|
401
|
+
logger.error({
|
|
402
|
+
dataPointId: dataPoint.id,
|
|
403
|
+
scope: dataPoint.scope,
|
|
404
|
+
error: err.message,
|
|
405
|
+
}, "Failed to download data point");
|
|
406
|
+
failed = true;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
// 4. Advance cursor only when every record in the page was handled.
|
|
410
|
+
if (nextCursor !== null && !failed) {
|
|
411
|
+
await cursor.write(nextCursor);
|
|
412
|
+
}
|
|
413
|
+
else if (failed) {
|
|
414
|
+
logger.warn({ nextCursor }, "Download cursor not advanced because one or more data points failed");
|
|
415
|
+
}
|
|
416
|
+
return results;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Apply a gateway tombstone to the local index: remove every local version
|
|
420
|
+
* the tombstone covers (synced rows at or below its version, and unsynced
|
|
421
|
+
* rows ingested without knowledge of it), keep unsynced rows ingested on top
|
|
422
|
+
* of it (a legitimate re-add that the upload worker registers after the
|
|
423
|
+
* tombstone version). See `isEntryCoveredByTombstone`.
|
|
424
|
+
*/
|
|
425
|
+
export async function reconcileDeletedDataPoint(deps, record, deletedAt) {
|
|
426
|
+
const tombstone = { version: tombstoneVersion(record) };
|
|
427
|
+
const tombstoned = tombstone.version === null ? null : BigInt(tombstone.version);
|
|
428
|
+
// Unsynced covered entries above the tombstone version: the deleting
|
|
429
|
+
// replica's exact-key pass only enumerates registry versions, so any
|
|
430
|
+
// ciphertext this replica uploaded under a higher, never-registered key is
|
|
431
|
+
// ours to clean up.
|
|
432
|
+
const orphanKeys = [];
|
|
433
|
+
const { storage, logger } = deps;
|
|
434
|
+
const PAGE_SIZE = 500;
|
|
435
|
+
const stale = [];
|
|
436
|
+
let kept = 0;
|
|
437
|
+
for (let offset = 0;; offset += PAGE_SIZE) {
|
|
438
|
+
const entries = storage.listVersions(record.scope, {
|
|
439
|
+
limit: PAGE_SIZE,
|
|
440
|
+
offset,
|
|
441
|
+
});
|
|
442
|
+
for (const entry of entries) {
|
|
443
|
+
if (isEntryCoveredByTombstone(entry, tombstone)) {
|
|
444
|
+
stale.push({ scope: entry.scope, collectedAt: entry.collectedAt });
|
|
445
|
+
if (entry.dataPointId === null &&
|
|
446
|
+
(tombstoned === null || BigInt(entry.version) > tombstoned)) {
|
|
447
|
+
orphanKeys.push({
|
|
448
|
+
scope: entry.scope,
|
|
449
|
+
version: String(entry.version),
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
else {
|
|
454
|
+
kept += 1;
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
if (entries.length < PAGE_SIZE)
|
|
458
|
+
break;
|
|
459
|
+
}
|
|
460
|
+
let removed = 0;
|
|
461
|
+
for (const version of stale) {
|
|
462
|
+
if (await storage.deleteVersion(version.scope, version.collectedAt)) {
|
|
463
|
+
removed += 1;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (orphanKeys.length > 0 && deps.pendingBlobDeletions) {
|
|
467
|
+
await deps.pendingBlobDeletions.add(orphanKeys);
|
|
468
|
+
}
|
|
469
|
+
if (removed > 0 || kept > 0) {
|
|
470
|
+
logger.info({ dataPointId: record.id, scope: record.scope, deletedAt, removed, kept }, "Reconciled gateway deletion against local index");
|
|
471
|
+
}
|
|
472
|
+
return { scope: record.scope, deletedAt, removed, kept };
|
|
473
|
+
}
|
|
474
|
+
export async function repairLocalMissingBlockSidecars(deps) {
|
|
475
|
+
const { storage, logger, diagnostics } = deps;
|
|
476
|
+
if (!storage.writeBlockManifest || !storage.hasScopeBlocks) {
|
|
477
|
+
return { repaired: 0, missingEnvelopeEntries: 0 };
|
|
478
|
+
}
|
|
479
|
+
let repaired = 0;
|
|
480
|
+
let missingEnvelopeEntries = 0;
|
|
481
|
+
let offset = 0;
|
|
482
|
+
const limit = 100;
|
|
483
|
+
while (true) {
|
|
484
|
+
const page = storage.listScopes({ limit, offset });
|
|
485
|
+
let deletedEntryInPage = false;
|
|
486
|
+
for (const scopeSummary of page.scopes) {
|
|
487
|
+
const entry = storage.findEntry({
|
|
488
|
+
scope: scopeSummary.scope,
|
|
489
|
+
at: scopeSummary.latestCollectedAt,
|
|
490
|
+
});
|
|
491
|
+
if (!entry)
|
|
492
|
+
continue;
|
|
493
|
+
const repairResult = await repairMissingBlockSidecars(storage, logger, {
|
|
494
|
+
dataPointId: entry.dataPointId ?? entry.path,
|
|
495
|
+
schemaId: entry.schemaId,
|
|
496
|
+
}, entry, diagnostics);
|
|
497
|
+
if (repairResult === "repaired")
|
|
498
|
+
repaired += 1;
|
|
499
|
+
if (repairResult === "missing-envelope") {
|
|
500
|
+
missingEnvelopeEntries += 1;
|
|
501
|
+
deletedEntryInPage = true;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (!deletedEntryInPage) {
|
|
505
|
+
offset += page.scopes.length;
|
|
506
|
+
}
|
|
507
|
+
if (offset >= page.total || page.scopes.length === 0)
|
|
508
|
+
break;
|
|
509
|
+
}
|
|
510
|
+
if (repaired > 0) {
|
|
511
|
+
logger.info({ repaired }, "Repaired missing bounded block sidecars for local indexed data");
|
|
512
|
+
}
|
|
513
|
+
if (missingEnvelopeEntries > 0) {
|
|
514
|
+
logger.warn({ missingEnvelopeEntries }, "Removed stale local index entries missing local envelopes");
|
|
515
|
+
}
|
|
516
|
+
return { repaired, missingEnvelopeEntries };
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Offer a freshly indexed envelope to the PDPP importer.
|
|
520
|
+
*
|
|
521
|
+
* Deliberately total: every outcome is handled and none escapes. A rejection
|
|
522
|
+
* is a WARNING rather than an error because it means the producer sent
|
|
523
|
+
* something this deployment could not verify — actionable, but not a fault of
|
|
524
|
+
* this sync cycle, and not a reason to re-download a blob that arrived
|
|
525
|
+
* intact. `skipped` is the ordinary legacy case and stays silent.
|
|
526
|
+
*/
|
|
527
|
+
function importIntoPdpp(deps, envelope, dataPointId) {
|
|
528
|
+
if (!deps.pdppImporter)
|
|
529
|
+
return;
|
|
530
|
+
try {
|
|
531
|
+
const outcome = deps.pdppImporter.importEnvelope({
|
|
532
|
+
scope: envelope.scope,
|
|
533
|
+
collectedAt: envelope.collectedAt,
|
|
534
|
+
data: envelope.data,
|
|
535
|
+
});
|
|
536
|
+
if (outcome.status === "rejected") {
|
|
537
|
+
// Both are visible, but they mean different things and an operator
|
|
538
|
+
// needs to tell them apart: a permanent verdict is about the producer's
|
|
539
|
+
// bytes and will never change, while a transient one is about this
|
|
540
|
+
// deployment and clears on a later cycle.
|
|
541
|
+
const permanent = isPermanentRejection(outcome.rejection);
|
|
542
|
+
deps.logger.warn({
|
|
543
|
+
dataPointId,
|
|
544
|
+
scope: envelope.scope,
|
|
545
|
+
code: outcome.rejection.code,
|
|
546
|
+
message: outcome.rejection.message,
|
|
547
|
+
permanent,
|
|
548
|
+
}, permanent
|
|
549
|
+
? "Synced data point was refused by the PDPP importer and will not be retried"
|
|
550
|
+
: "PDPP import unavailable for this data point; a later sync will retry it");
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
catch (err) {
|
|
554
|
+
// A throwing importer is infrastructure failing, not the envelope being
|
|
555
|
+
// wrong, so this is retryable by construction — and the retry path above
|
|
556
|
+
// is what makes that statement true rather than aspirational.
|
|
557
|
+
deps.logger.warn({ dataPointId, scope: envelope.scope, error: err.message }, "PDPP import threw; data point stays indexed and a later sync will retry it");
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
/**
|
|
561
|
+
* Re-offer an already-indexed data point to the PDPP importer, reading the
|
|
562
|
+
* envelope back from local storage.
|
|
563
|
+
*
|
|
564
|
+
* This exists because legacy indexing and PDPP import are two separate
|
|
565
|
+
* writes with no shared transaction. Anything that interrupts between them —
|
|
566
|
+
* a throwing importer, an unmounted PDPP, a store that is briefly unhealthy
|
|
567
|
+
* — leaves an envelope that is indexed but not imported, and the index entry
|
|
568
|
+
* then suppresses every future attempt.
|
|
569
|
+
*
|
|
570
|
+
* Reads the cached local envelope rather than re-downloading: the plaintext
|
|
571
|
+
* is already on disk, so re-fetching and re-decrypting the blob would burn
|
|
572
|
+
* network and CPU on every cycle for no new information. The importer's own
|
|
573
|
+
* idempotency (compare-before-write) is what keeps a repeated offer from
|
|
574
|
+
* producing a duplicate revision, so this cannot inflate `changes_since`.
|
|
575
|
+
*
|
|
576
|
+
* Best-effort throughout. The data point is durably stored and indexed
|
|
577
|
+
* already; a failure here must never fail the sync cycle or block its cursor.
|
|
578
|
+
*/
|
|
579
|
+
async function retryPdppImportFromLocal(deps, entry) {
|
|
580
|
+
if (!deps.pdppImporter)
|
|
581
|
+
return;
|
|
582
|
+
// Nothing a re-read could change: already imported, verified unchanged,
|
|
583
|
+
// permanently refused, or carrying no `$pdpp` at all. Without this gate the
|
|
584
|
+
// retry would re-read and re-verify every legacy data point on every cycle,
|
|
585
|
+
// forever, to reach the same answer.
|
|
586
|
+
if (!deps.pdppImporter.needsRetry(entry.scope, entry.collectedAt))
|
|
587
|
+
return;
|
|
588
|
+
let envelope;
|
|
589
|
+
try {
|
|
590
|
+
envelope = await deps.storage.readEnvelope(entry.scope, entry.collectedAt);
|
|
591
|
+
}
|
|
592
|
+
catch (err) {
|
|
593
|
+
// No local payload to retry from. The sidecar repair path above already
|
|
594
|
+
// handles a missing envelope by re-downloading, so this is not the place
|
|
595
|
+
// to fix it — just don't pretend an import was attempted.
|
|
596
|
+
deps.logger.debug({
|
|
597
|
+
scope: entry.scope,
|
|
598
|
+
collectedAt: entry.collectedAt,
|
|
599
|
+
error: err.message,
|
|
600
|
+
}, "Skipped PDPP import retry: no local envelope to read");
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
importIntoPdpp(deps, envelope, `${entry.scope}@${entry.collectedAt}`);
|
|
604
|
+
}
|
|
605
|
+
function createSyncRunId() {
|
|
606
|
+
return typeof crypto !== "undefined" &&
|
|
607
|
+
typeof crypto.randomUUID === "function"
|
|
608
|
+
? crypto.randomUUID()
|
|
609
|
+
: `download-${Date.now().toString(36)}`;
|
|
610
|
+
}
|
|
611
|
+
function uint8ToHex(bytes) {
|
|
612
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
613
|
+
}
|
|
614
|
+
function withSyncFailureMetadata(error, metadata) {
|
|
615
|
+
if (error instanceof Error) {
|
|
616
|
+
Object.assign(error, { syncFailureMetadata: metadata });
|
|
617
|
+
return error;
|
|
618
|
+
}
|
|
619
|
+
return { error, syncFailureMetadata: metadata };
|
|
620
|
+
}
|
|
621
|
+
function getSyncFailureMetadata(error) {
|
|
622
|
+
if (typeof error !== "object" || error === null)
|
|
623
|
+
return {};
|
|
624
|
+
const metadata = error
|
|
625
|
+
.syncFailureMetadata;
|
|
626
|
+
if (typeof metadata !== "object" || metadata === null)
|
|
627
|
+
return {};
|
|
628
|
+
return metadata;
|
|
629
|
+
}
|
|
630
|
+
async function writeBlockSidecars(storage, envelope, logger, ctx, relativePath, diagnostics) {
|
|
631
|
+
if (!storage.writeBlockManifest)
|
|
632
|
+
return;
|
|
633
|
+
diagnostics?.onManifestBuildStart(ctx.dataPointId, envelope.scope);
|
|
634
|
+
try {
|
|
635
|
+
const built = await buildDataBlocksAsync({
|
|
636
|
+
scope: envelope.scope,
|
|
637
|
+
collectedAt: envelope.collectedAt,
|
|
638
|
+
schemaId: ctx.schemaId ?? undefined,
|
|
639
|
+
content: envelope,
|
|
640
|
+
});
|
|
641
|
+
await storage.writeBlockManifest(envelope.scope, envelope.collectedAt, built.manifest, built.blocks);
|
|
642
|
+
diagnostics?.onManifestBuildEnd(ctx.dataPointId, envelope.scope);
|
|
643
|
+
}
|
|
644
|
+
catch (error) {
|
|
645
|
+
const classified = classifySyncFailure({
|
|
646
|
+
error,
|
|
647
|
+
fileId: ctx.dataPointId,
|
|
648
|
+
syncRunId: "download",
|
|
649
|
+
stage: "block_build",
|
|
650
|
+
schemaId: ctx.schemaId ?? undefined,
|
|
651
|
+
scope: envelope.scope,
|
|
652
|
+
});
|
|
653
|
+
diagnostics?.onManifestBuildError(ctx.dataPointId, envelope.scope, classified.issue.message);
|
|
654
|
+
logger.warn({
|
|
655
|
+
dataPointId: ctx.dataPointId,
|
|
656
|
+
scope: envelope.scope,
|
|
657
|
+
collectedAt: envelope.collectedAt,
|
|
658
|
+
path: relativePath,
|
|
659
|
+
stage: classified.issue.stage,
|
|
660
|
+
errorClass: classified.issue.errorClass,
|
|
661
|
+
message: classified.issue.message,
|
|
662
|
+
}, "Bounded block sidecar write failed after raw envelope write");
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
async function repairMissingBlockSidecars(storage, logger, ctx, entry, diagnostics) {
|
|
666
|
+
if (!storage.writeBlockManifest || !storage.hasScopeBlocks) {
|
|
667
|
+
return "not-repaired";
|
|
668
|
+
}
|
|
669
|
+
let hasBlocks = false;
|
|
670
|
+
try {
|
|
671
|
+
hasBlocks = await storage.hasScopeBlocks(entry.scope, entry.collectedAt);
|
|
672
|
+
}
|
|
673
|
+
catch (error) {
|
|
674
|
+
logger.warn({
|
|
675
|
+
dataPointId: ctx.dataPointId,
|
|
676
|
+
scope: entry.scope,
|
|
677
|
+
collectedAt: entry.collectedAt,
|
|
678
|
+
error: error.message,
|
|
679
|
+
}, "Bounded block sidecar repair skipped after readiness check failed");
|
|
680
|
+
return "not-repaired";
|
|
681
|
+
}
|
|
682
|
+
if (hasBlocks)
|
|
683
|
+
return "already-ready";
|
|
684
|
+
diagnostics?.onRepair(entry.scope, "indexed entry missing block manifest; rebuilding from local envelope");
|
|
685
|
+
let envelope;
|
|
686
|
+
try {
|
|
687
|
+
envelope = await storage.readEnvelope(entry.scope, entry.collectedAt);
|
|
688
|
+
}
|
|
689
|
+
catch (error) {
|
|
690
|
+
logger.warn({
|
|
691
|
+
dataPointId: ctx.dataPointId,
|
|
692
|
+
scope: entry.scope,
|
|
693
|
+
collectedAt: entry.collectedAt,
|
|
694
|
+
error: error.message,
|
|
695
|
+
}, "Bounded block sidecar repair skipped because local envelope is unavailable");
|
|
696
|
+
// Remove the stale index entry whose payload is gone. We can only target
|
|
697
|
+
// it by gateway fileId; DataPoint-only entries (fileId === null) are left
|
|
698
|
+
// in place (no path-keyed delete on the port) and self-heal on re-download.
|
|
699
|
+
if (entry.fileId) {
|
|
700
|
+
diagnostics?.onRepair(entry.scope, "index exists without local payload; removing stale local index entry");
|
|
701
|
+
const removed = await storage.deleteByFileId(entry.fileId);
|
|
702
|
+
logger.warn({
|
|
703
|
+
dataPointId: ctx.dataPointId,
|
|
704
|
+
scope: entry.scope,
|
|
705
|
+
collectedAt: entry.collectedAt,
|
|
706
|
+
removed,
|
|
707
|
+
}, "Removed stale local index entry missing local envelope");
|
|
708
|
+
return removed ? "missing-envelope" : "not-repaired";
|
|
709
|
+
}
|
|
710
|
+
return "not-repaired";
|
|
711
|
+
}
|
|
712
|
+
await writeBlockSidecars(storage, envelope, logger, {
|
|
713
|
+
dataPointId: ctx.dataPointId,
|
|
714
|
+
schemaId: entry.schemaId ?? ctx.schemaId,
|
|
715
|
+
}, entry.path, diagnostics);
|
|
716
|
+
try {
|
|
717
|
+
return (await storage.hasScopeBlocks(entry.scope, entry.collectedAt))
|
|
718
|
+
? "repaired"
|
|
719
|
+
: "not-repaired";
|
|
720
|
+
}
|
|
721
|
+
catch (error) {
|
|
722
|
+
logger.warn({
|
|
723
|
+
dataPointId: ctx.dataPointId,
|
|
724
|
+
scope: entry.scope,
|
|
725
|
+
collectedAt: entry.collectedAt,
|
|
726
|
+
error: error.message,
|
|
727
|
+
}, "Bounded block sidecar repair completed but readiness could not be verified");
|
|
728
|
+
return "not-repaired";
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
//# sourceMappingURL=download.js.map
|