@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,422 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import qualifying synced DataPipe envelopes into the PDPP record store.
|
|
3
|
+
*
|
|
4
|
+
* The production path already existed end to end: Unity's OwnerDataClient
|
|
5
|
+
* writes an encrypted `DataFileEnvelope` and registers it with the Gateway,
|
|
6
|
+
* and `sync/workers/download.ts` downloads, decrypts and indexes it. What was
|
|
7
|
+
* missing was the last hop — that decrypted envelope reaching the PDPP record
|
|
8
|
+
* store, so a grant-bound client can read it. This module is that hop, and
|
|
9
|
+
* nothing else: it does not fetch, does not decrypt, and does not open a
|
|
10
|
+
* second ingestion surface. There is no web HTTP ingest here by design; the
|
|
11
|
+
* encrypted owner-data transport stays the only way data arrives.
|
|
12
|
+
*
|
|
13
|
+
* Why the metadata lives in `data.$pdpp`
|
|
14
|
+
* -------------------------------------
|
|
15
|
+
* The SDK's `DataFileEnvelopeSchema` accepts only `$schema`, `version`,
|
|
16
|
+
* `scope`, `schemaId`, `collectedAt` and `data`, and STRIPS unknown top-level
|
|
17
|
+
* keys. A `$pdpp` sibling of `scope` would therefore be silently deleted in
|
|
18
|
+
* transit — not rejected, deleted — so the producer nests it inside `data`,
|
|
19
|
+
* the one field whose interior the transport preserves verbatim. That is a
|
|
20
|
+
* transport constraint, not a preference.
|
|
21
|
+
*
|
|
22
|
+
* The consequence this module owns: `$pdpp` is import metadata that arrived
|
|
23
|
+
* inside the payload, so it must be removed before the record is stored.
|
|
24
|
+
* Otherwise every PDPP read would serve back a `$pdpp` blob that is not part
|
|
25
|
+
* of the source's declared schema, and a field projection computed from the
|
|
26
|
+
* declaration would not cover it.
|
|
27
|
+
*
|
|
28
|
+
* What is verified before anything is written
|
|
29
|
+
* -------------------------------------------
|
|
30
|
+
* Every check below is a fail-closed rejection, because the alternative is
|
|
31
|
+
* importing a record whose identity or authority we could not confirm:
|
|
32
|
+
*
|
|
33
|
+
* 1. `$pdpp.version === 1`. An unknown metadata version is refused rather
|
|
34
|
+
* than interpreted under this version's assumptions.
|
|
35
|
+
* 2. The declaration digest is recomputed over the EXACT retained
|
|
36
|
+
* declaration document this deployment booted with, and must equal the
|
|
37
|
+
* digest the producer claims. This is the check that makes the rest
|
|
38
|
+
* meaningful: without it the producer would be asserting its own
|
|
39
|
+
* authority over the stream shape it is being validated against.
|
|
40
|
+
* 3. `scope`, `stream.name` and `primaryKey` must agree with that same
|
|
41
|
+
* declaration, and `record.key` must agree with the payload's actual
|
|
42
|
+
* primary-key values.
|
|
43
|
+
*
|
|
44
|
+
* Only then is `$pdpp` stripped and the record handed to the store.
|
|
45
|
+
*
|
|
46
|
+
* Instance derivation is PS-owned
|
|
47
|
+
* -------------------------------
|
|
48
|
+
* The producer supplies no instance id and must not: an instance handle is a
|
|
49
|
+
* statement about this deployment's connection inventory, which the producer
|
|
50
|
+
* cannot observe. The importer derives it through the same function the
|
|
51
|
+
* authorization and resource servers use, so an imported record is readable
|
|
52
|
+
* under a grant issued for the same source. An id that cannot be derived is a
|
|
53
|
+
* rejection, never an invention.
|
|
54
|
+
*/
|
|
55
|
+
import { computeRecordKeyFromData } from "../storage/pdpp-records/record-key.js";
|
|
56
|
+
/** The reserved key carrying PDPP import metadata inside `data`. */
|
|
57
|
+
export const PDPP_METADATA_KEY = "$pdpp";
|
|
58
|
+
/** The only `$pdpp.version` this importer understands. */
|
|
59
|
+
export const SUPPORTED_PDPP_METADATA_VERSION = 1;
|
|
60
|
+
/**
|
|
61
|
+
* Rejection codes that describe the ENVELOPE rather than this deployment's
|
|
62
|
+
* current state. They are permanent verdicts: the same bytes re-read on a
|
|
63
|
+
* later cycle produce the same answer, so retrying them is work that can
|
|
64
|
+
* never succeed.
|
|
65
|
+
*
|
|
66
|
+
* `unknown_source` and `no_instance` are deliberately NOT here. Both depend
|
|
67
|
+
* on what this deployment has mounted — a declaration that is not retained
|
|
68
|
+
* yet, or an instance inventory that is not populated yet — and both start
|
|
69
|
+
* working once boot completes or an operator provisions the declaration.
|
|
70
|
+
* Treating them as permanent is exactly how an envelope gets stranded.
|
|
71
|
+
* `store_rejected` is likewise excluded: the store is infrastructure, and a
|
|
72
|
+
* write it refuses today may be accepted once it is healthy.
|
|
73
|
+
*/
|
|
74
|
+
const PERMANENT_REJECTION_CODES = new Set([
|
|
75
|
+
"malformed_metadata",
|
|
76
|
+
"unsupported_metadata_version",
|
|
77
|
+
"digest_mismatch",
|
|
78
|
+
"declaration_version_mismatch",
|
|
79
|
+
"scope_mismatch",
|
|
80
|
+
"unknown_stream",
|
|
81
|
+
"primary_key_mismatch",
|
|
82
|
+
"semantics_mismatch",
|
|
83
|
+
"record_key_mismatch",
|
|
84
|
+
]);
|
|
85
|
+
/**
|
|
86
|
+
* Whether a rejection is a settled verdict about the envelope itself.
|
|
87
|
+
*
|
|
88
|
+
* Callers use this to decide whether re-offering the same envelope later
|
|
89
|
+
* could ever change the answer. Fail-closed by construction: an unrecognized
|
|
90
|
+
* code is treated as transient, so a new failure mode is retried (visibly,
|
|
91
|
+
* with a logged outcome) rather than silently abandoned.
|
|
92
|
+
*/
|
|
93
|
+
export function isPermanentRejection(rejection) {
|
|
94
|
+
return PERMANENT_REJECTION_CODES.has(rejection.code);
|
|
95
|
+
}
|
|
96
|
+
function reject(code, message) {
|
|
97
|
+
return { status: "rejected", rejection: { code, message } };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Normalize a claimed digest to bare lowercase hex.
|
|
101
|
+
*
|
|
102
|
+
* The producer contract writes `sha256:<hex>`; this repo's
|
|
103
|
+
* `computeDeclarationDigest` returns bare hex with no prefix. Accepting both
|
|
104
|
+
* spellings of the same SHA-256 value keeps the two sides interoperable
|
|
105
|
+
* without either silently coercing the other. Any OTHER algorithm prefix
|
|
106
|
+
* returns null and fails the import: treating `md5:...` as if it were the
|
|
107
|
+
* SHA-256 we computed would turn the digest check into decoration.
|
|
108
|
+
*/
|
|
109
|
+
export function normalizeDigest(claimed) {
|
|
110
|
+
const trimmed = claimed.trim().toLowerCase();
|
|
111
|
+
const colon = trimmed.indexOf(":");
|
|
112
|
+
if (colon === -1)
|
|
113
|
+
return /^[0-9a-f]{64}$/.test(trimmed) ? trimmed : null;
|
|
114
|
+
if (trimmed.slice(0, colon) !== "sha256")
|
|
115
|
+
return null;
|
|
116
|
+
const hex = trimmed.slice(colon + 1);
|
|
117
|
+
return /^[0-9a-f]{64}$/.test(hex) ? hex : null;
|
|
118
|
+
}
|
|
119
|
+
function isRecord(value) {
|
|
120
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Read `data.$pdpp` into a typed shape, or explain why it is not usable.
|
|
124
|
+
*
|
|
125
|
+
* Returns `null` for "no metadata present", which is the ordinary legacy
|
|
126
|
+
* case and must stay distinguishable from a malformed `$pdpp` — a producer
|
|
127
|
+
* that writes broken metadata should be visible, not silently treated as a
|
|
128
|
+
* legacy write.
|
|
129
|
+
*/
|
|
130
|
+
function readMetadata(data) {
|
|
131
|
+
if (!isRecord(data))
|
|
132
|
+
return null;
|
|
133
|
+
const raw = data[PDPP_METADATA_KEY];
|
|
134
|
+
if (raw === undefined)
|
|
135
|
+
return null;
|
|
136
|
+
if (!isRecord(raw))
|
|
137
|
+
return { ok: false, reason: "$pdpp is not an object" };
|
|
138
|
+
if (typeof raw.version !== "number") {
|
|
139
|
+
return { ok: false, reason: "$pdpp.version is missing or not a number" };
|
|
140
|
+
}
|
|
141
|
+
if (typeof raw.sourceId !== "string" || raw.sourceId.length === 0) {
|
|
142
|
+
return { ok: false, reason: "$pdpp.sourceId is missing" };
|
|
143
|
+
}
|
|
144
|
+
const declaration = raw.declaration;
|
|
145
|
+
if (!isRecord(declaration)) {
|
|
146
|
+
return { ok: false, reason: "$pdpp.declaration is missing" };
|
|
147
|
+
}
|
|
148
|
+
if (typeof declaration.digest !== "string" ||
|
|
149
|
+
declaration.digest.length === 0) {
|
|
150
|
+
return { ok: false, reason: "$pdpp.declaration.digest is missing" };
|
|
151
|
+
}
|
|
152
|
+
if (typeof declaration.version !== "string") {
|
|
153
|
+
return { ok: false, reason: "$pdpp.declaration.version is missing" };
|
|
154
|
+
}
|
|
155
|
+
const stream = raw.stream;
|
|
156
|
+
if (!isRecord(stream))
|
|
157
|
+
return { ok: false, reason: "$pdpp.stream is missing" };
|
|
158
|
+
if (typeof stream.name !== "string" || stream.name.length === 0) {
|
|
159
|
+
return { ok: false, reason: "$pdpp.stream.name is missing" };
|
|
160
|
+
}
|
|
161
|
+
if (typeof stream.scope !== "string" || stream.scope.length === 0) {
|
|
162
|
+
return { ok: false, reason: "$pdpp.stream.scope is missing" };
|
|
163
|
+
}
|
|
164
|
+
if (!Array.isArray(stream.primaryKey) ||
|
|
165
|
+
stream.primaryKey.length === 0 ||
|
|
166
|
+
!stream.primaryKey.every((f) => typeof f === "string")) {
|
|
167
|
+
return { ok: false, reason: "$pdpp.stream.primaryKey is missing" };
|
|
168
|
+
}
|
|
169
|
+
const record = raw.record;
|
|
170
|
+
if (!isRecord(record))
|
|
171
|
+
return { ok: false, reason: "$pdpp.record is missing" };
|
|
172
|
+
if (!isRecord(record.key)) {
|
|
173
|
+
return { ok: false, reason: "$pdpp.record.key is missing" };
|
|
174
|
+
}
|
|
175
|
+
const op = record.op ?? "upsert";
|
|
176
|
+
if (op !== "upsert" && op !== "delete") {
|
|
177
|
+
return {
|
|
178
|
+
ok: false,
|
|
179
|
+
reason: `$pdpp.record.op '${String(op)}' is not valid`,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
ok: true,
|
|
184
|
+
meta: {
|
|
185
|
+
version: raw.version,
|
|
186
|
+
sourceId: raw.sourceId,
|
|
187
|
+
declaration: {
|
|
188
|
+
source: typeof declaration.source === "string" ? declaration.source : "",
|
|
189
|
+
version: declaration.version,
|
|
190
|
+
upstreamCommit: typeof declaration.upstreamCommit === "string"
|
|
191
|
+
? declaration.upstreamCommit
|
|
192
|
+
: null,
|
|
193
|
+
digest: declaration.digest,
|
|
194
|
+
},
|
|
195
|
+
stream: {
|
|
196
|
+
name: stream.name,
|
|
197
|
+
scope: stream.scope,
|
|
198
|
+
semantics: typeof stream.semantics === "string" ? stream.semantics : "",
|
|
199
|
+
primaryKey: stream.primaryKey,
|
|
200
|
+
},
|
|
201
|
+
record: { key: record.key, op },
|
|
202
|
+
...(isRecord(raw.run) && {
|
|
203
|
+
run: {
|
|
204
|
+
...(typeof raw.run.id === "string" && { id: raw.run.id }),
|
|
205
|
+
...(typeof raw.run.source === "string" && { source: raw.run.source }),
|
|
206
|
+
},
|
|
207
|
+
}),
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/** Remove `$pdpp` without mutating the caller's object. */
|
|
212
|
+
function stripMetadata(data) {
|
|
213
|
+
const { [PDPP_METADATA_KEY]: _dropped, ...rest } = data;
|
|
214
|
+
return rest;
|
|
215
|
+
}
|
|
216
|
+
function sameArray(a, b) {
|
|
217
|
+
return a.length === b.length && a.every((v, i) => v === b[i]);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Deep structural equality over JSON-shaped values.
|
|
221
|
+
*
|
|
222
|
+
* Used only to decide "did this record actually change?". Key order must not
|
|
223
|
+
* count as a change: the producer re-serializes the payload on every run, so
|
|
224
|
+
* an order-sensitive comparison would report every re-sync as a new version
|
|
225
|
+
* and fill `changes_since` with records that are byte-identical to what a
|
|
226
|
+
* client already read.
|
|
227
|
+
*/
|
|
228
|
+
function jsonEqual(a, b) {
|
|
229
|
+
if (a === b)
|
|
230
|
+
return true;
|
|
231
|
+
if (typeof a !== typeof b)
|
|
232
|
+
return false;
|
|
233
|
+
if (a === null || b === null)
|
|
234
|
+
return false;
|
|
235
|
+
if (Array.isArray(a) || Array.isArray(b)) {
|
|
236
|
+
if (!Array.isArray(a) || !Array.isArray(b) || a.length !== b.length) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
return a.every((item, i) => jsonEqual(item, b[i]));
|
|
240
|
+
}
|
|
241
|
+
if (typeof a !== "object")
|
|
242
|
+
return false;
|
|
243
|
+
const ao = a;
|
|
244
|
+
const bo = b;
|
|
245
|
+
const aKeys = Object.keys(ao).sort();
|
|
246
|
+
const bKeys = Object.keys(bo).sort();
|
|
247
|
+
if (!sameArray(aKeys, bKeys))
|
|
248
|
+
return false;
|
|
249
|
+
return aKeys.every((k) => jsonEqual(ao[k], bo[k]));
|
|
250
|
+
}
|
|
251
|
+
export function createPdppImporter(deps) {
|
|
252
|
+
const { store, logger } = deps;
|
|
253
|
+
const bySourceId = new Map();
|
|
254
|
+
for (const declaration of deps.declarations) {
|
|
255
|
+
bySourceId.set(declaration.sourceId, declaration);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Versions whose import outcome cannot change on a later offer. Bounded by
|
|
259
|
+
* the number of distinct (scope, collectedAt) pairs this process sees, and
|
|
260
|
+
* holding only a short key per entry.
|
|
261
|
+
*/
|
|
262
|
+
const settled = new Set();
|
|
263
|
+
const versionKey = (scope, collectedAt) => `${scope}@${collectedAt}`;
|
|
264
|
+
function needsRetry(scope, collectedAt) {
|
|
265
|
+
return !settled.has(versionKey(scope, collectedAt));
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Record whether this version is done with, so the retry path can stop
|
|
269
|
+
* reading it back off disk every cycle.
|
|
270
|
+
*
|
|
271
|
+
* Only a transient rejection stays unsettled — that is the one outcome a
|
|
272
|
+
* later cycle can genuinely improve on.
|
|
273
|
+
*/
|
|
274
|
+
function importAndSettle(envelope) {
|
|
275
|
+
const outcome = importEnvelope(envelope);
|
|
276
|
+
const retryable = outcome.status === "rejected" && !isPermanentRejection(outcome.rejection);
|
|
277
|
+
if (!retryable) {
|
|
278
|
+
settled.add(versionKey(envelope.scope, envelope.collectedAt));
|
|
279
|
+
}
|
|
280
|
+
return outcome;
|
|
281
|
+
}
|
|
282
|
+
function importEnvelope(envelope) {
|
|
283
|
+
const read = readMetadata(envelope.data);
|
|
284
|
+
if (read === null)
|
|
285
|
+
return { status: "skipped" };
|
|
286
|
+
if (!read.ok)
|
|
287
|
+
return reject("malformed_metadata", read.reason);
|
|
288
|
+
const meta = read.meta;
|
|
289
|
+
if (meta.version !== SUPPORTED_PDPP_METADATA_VERSION) {
|
|
290
|
+
return reject("unsupported_metadata_version", `$pdpp.version ${meta.version} is not supported (expected ${SUPPORTED_PDPP_METADATA_VERSION})`);
|
|
291
|
+
}
|
|
292
|
+
const retained = bySourceId.get(meta.sourceId);
|
|
293
|
+
if (!retained) {
|
|
294
|
+
return reject("unknown_source", `no retained declaration for source '${meta.sourceId}'`);
|
|
295
|
+
}
|
|
296
|
+
// The digest gate. Everything after this point is validated against a
|
|
297
|
+
// document we have confirmed is the one the producer claims to have read.
|
|
298
|
+
const claimed = normalizeDigest(meta.declaration.digest);
|
|
299
|
+
if (claimed === null) {
|
|
300
|
+
return reject("digest_mismatch", `declaration digest '${meta.declaration.digest}' is not a recognized sha256 digest`);
|
|
301
|
+
}
|
|
302
|
+
if (claimed !== retained.documentDigest.trim().toLowerCase()) {
|
|
303
|
+
return reject("digest_mismatch", `declaration digest does not match the retained declaration for '${meta.sourceId}'`);
|
|
304
|
+
}
|
|
305
|
+
if (meta.declaration.version !== retained.version) {
|
|
306
|
+
return reject("declaration_version_mismatch", `declaration version '${meta.declaration.version}' does not match retained version '${retained.version}'`);
|
|
307
|
+
}
|
|
308
|
+
// The scope the envelope was transported under must be the scope the
|
|
309
|
+
// metadata claims. Without this, metadata for one scope could ride on a
|
|
310
|
+
// blob decrypted under another scope's key.
|
|
311
|
+
if (meta.stream.scope !== envelope.scope) {
|
|
312
|
+
return reject("scope_mismatch", `$pdpp.stream.scope '${meta.stream.scope}' does not match envelope scope '${envelope.scope}'`);
|
|
313
|
+
}
|
|
314
|
+
const declaredStream = retained.streams.find((s) => s.name === meta.stream.name);
|
|
315
|
+
if (!declaredStream) {
|
|
316
|
+
return reject("unknown_stream", `stream '${meta.stream.name}' is not declared by the retained declaration for '${meta.sourceId}'`);
|
|
317
|
+
}
|
|
318
|
+
if (!sameArray(meta.stream.primaryKey, declaredStream.primaryKey)) {
|
|
319
|
+
return reject("primary_key_mismatch", `stream '${meta.stream.name}' declares primary key [${declaredStream.primaryKey.join(", ")}] but the envelope claims [${meta.stream.primaryKey.join(", ")}]`);
|
|
320
|
+
}
|
|
321
|
+
if (meta.stream.semantics.length > 0 &&
|
|
322
|
+
meta.stream.semantics !== declaredStream.semantics) {
|
|
323
|
+
return reject("semantics_mismatch", `stream '${meta.stream.name}' is ${declaredStream.semantics} here but the envelope claims '${meta.stream.semantics}'`);
|
|
324
|
+
}
|
|
325
|
+
const instance = deps.instanceFor(meta.sourceId);
|
|
326
|
+
if (!instance) {
|
|
327
|
+
return reject("no_instance", `no instance handle could be derived for source '${meta.sourceId}'`);
|
|
328
|
+
}
|
|
329
|
+
if (!isRecord(envelope.data)) {
|
|
330
|
+
return reject("malformed_metadata", "envelope data is not an object");
|
|
331
|
+
}
|
|
332
|
+
const payload = stripMetadata(envelope.data);
|
|
333
|
+
// `record.key` is the producer's claim about identity; the payload is the
|
|
334
|
+
// record. They must agree, or the record would be stored under a key that
|
|
335
|
+
// does not describe it — and a grant naming that key would authorize the
|
|
336
|
+
// wrong row.
|
|
337
|
+
let keyFromData;
|
|
338
|
+
let keyFromClaim;
|
|
339
|
+
try {
|
|
340
|
+
keyFromData = computeRecordKeyFromData(payload, declaredStream.primaryKey);
|
|
341
|
+
keyFromClaim = computeRecordKeyFromData(meta.record.key, declaredStream.primaryKey);
|
|
342
|
+
}
|
|
343
|
+
catch (err) {
|
|
344
|
+
return reject("record_key_mismatch", err.message);
|
|
345
|
+
}
|
|
346
|
+
if (keyFromData !== keyFromClaim) {
|
|
347
|
+
return reject("record_key_mismatch", "$pdpp.record.key does not match the payload's primary key values");
|
|
348
|
+
}
|
|
349
|
+
// Idempotency. `ingestBatch` allocates a NEW version on every accepted
|
|
350
|
+
// mutable_state upsert, so an unconditional re-ingest would bump the
|
|
351
|
+
// version and publish a `changes_since` entry every time the sync worker
|
|
352
|
+
// re-downloads an unchanged record — which it does on any full reconcile
|
|
353
|
+
// or retry. Comparing against the stored row first is what makes a repeat
|
|
354
|
+
// sync a no-op rather than a fabricated change.
|
|
355
|
+
// `getRecord` returns undefined for a deleted row as well as an absent
|
|
356
|
+
// one, which is exactly the distinction both branches below need.
|
|
357
|
+
const existing = store.getRecord(instance, meta.stream.name, keyFromData);
|
|
358
|
+
const unchanged = {
|
|
359
|
+
status: "unchanged",
|
|
360
|
+
instance,
|
|
361
|
+
stream: meta.stream.name,
|
|
362
|
+
recordKey: keyFromData,
|
|
363
|
+
};
|
|
364
|
+
if (meta.record.op === "delete") {
|
|
365
|
+
// A delete for a record we do not currently hold changes nothing.
|
|
366
|
+
// Ingesting it would write a tombstone announcing the removal of
|
|
367
|
+
// something this store never served — a fabricated change.
|
|
368
|
+
if (!existing)
|
|
369
|
+
return unchanged;
|
|
370
|
+
}
|
|
371
|
+
else if (existing &&
|
|
372
|
+
jsonEqual(existing.data, payload) &&
|
|
373
|
+
existing.emittedAt === envelope.collectedAt) {
|
|
374
|
+
return unchanged;
|
|
375
|
+
}
|
|
376
|
+
// A single-field key must stay a bare string. `encodeRecordKey` treats an
|
|
377
|
+
// array as a COMPOUND key and JSON-encodes it, so wrapping a lone value
|
|
378
|
+
// in an array would produce `["235680975"]` where the data yields
|
|
379
|
+
// `235680975` — a key/data mismatch the store rejects, on every record of
|
|
380
|
+
// every single-key stream.
|
|
381
|
+
const components = declaredStream.primaryKey.map((f) => String(payload[f]));
|
|
382
|
+
const input = {
|
|
383
|
+
instance,
|
|
384
|
+
stream: meta.stream.name,
|
|
385
|
+
key: components.length === 1 ? components[0] : components,
|
|
386
|
+
data: meta.record.op === "delete" ? null : payload,
|
|
387
|
+
emitted_at: envelope.collectedAt,
|
|
388
|
+
op: meta.record.op,
|
|
389
|
+
};
|
|
390
|
+
// One envelope per call, but through the batch API so the store's own
|
|
391
|
+
// transaction wraps the write: a failure rolls back rather than leaving
|
|
392
|
+
// a row without its history entry.
|
|
393
|
+
const result = store.ingestBatch([input], () => declaredStream.semantics, () => declaredStream.primaryKey);
|
|
394
|
+
if (result.rejected.length > 0) {
|
|
395
|
+
return reject("store_rejected", result.rejected[0].reason);
|
|
396
|
+
}
|
|
397
|
+
if (result.accepted === 0) {
|
|
398
|
+
// append_only duplicate: the store treats it as a no-op, and so do we.
|
|
399
|
+
return {
|
|
400
|
+
status: "unchanged",
|
|
401
|
+
instance,
|
|
402
|
+
stream: meta.stream.name,
|
|
403
|
+
recordKey: keyFromData,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
logger.info({
|
|
407
|
+
instance,
|
|
408
|
+
stream: meta.stream.name,
|
|
409
|
+
sourceId: meta.sourceId,
|
|
410
|
+
op: meta.record.op,
|
|
411
|
+
...(meta.run?.id && { runId: meta.run.id }),
|
|
412
|
+
}, "Imported synced DataPipe record into the PDPP record store");
|
|
413
|
+
return {
|
|
414
|
+
status: "imported",
|
|
415
|
+
instance,
|
|
416
|
+
stream: meta.stream.name,
|
|
417
|
+
recordKey: keyFromData,
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
return { importEnvelope: importAndSettle, needsRetry };
|
|
421
|
+
}
|
|
422
|
+
//# sourceMappingURL=pdpp-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pdpp-import.js","sourceRoot":"","sources":["../../src/sync/pdpp-import.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { PendingBlobDeletion, PendingBlobDeletionStore } from "../ports/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal persistence seam for the pending-blob-deletion markers. Hosts
|
|
4
|
+
* supply the storage (a JSON file on Node, IndexedDB state in the browser);
|
|
5
|
+
* the store keeps the set semantics, de-duplication and mutation ordering in
|
|
6
|
+
* one place. `write` must replace the whole value atomically (tmp + rename on
|
|
7
|
+
* disk, a single IndexedDB put in the browser) so a crash mid-write cannot
|
|
8
|
+
* leave a torn marker file.
|
|
9
|
+
*/
|
|
10
|
+
export interface PendingBlobDeletionKv {
|
|
11
|
+
read(): Promise<PendingBlobDeletion[] | null>;
|
|
12
|
+
write(keys: PendingBlobDeletion[]): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Accept the stored value from either marker generation: exact keys
|
|
16
|
+
* (`{ scope, version }`) or the pre-key format that recorded whole scopes,
|
|
17
|
+
* which maps to a version-less marker the retry expands into exact keys.
|
|
18
|
+
*/
|
|
19
|
+
export declare function normalizePendingBlobDeletions(stored: unknown): PendingBlobDeletion[];
|
|
20
|
+
/**
|
|
21
|
+
* Every operation is a read-modify-write of the whole marker set, so the
|
|
22
|
+
* store serialises them: a delete recording keys while a sync cycle's retry
|
|
23
|
+
* clears others must not lose either update. Ordering is FIFO, and a failed
|
|
24
|
+
* operation never blocks the ones queued behind it.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createPendingBlobDeletionStore(kv: PendingBlobDeletionKv): PendingBlobDeletionStore;
|
|
27
|
+
/** Non-durable store: markers survive only for the process lifetime. */
|
|
28
|
+
export declare function createMemoryPendingBlobDeletionStore(): PendingBlobDeletionStore;
|
|
29
|
+
//# sourceMappingURL=pending-blob-deletions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-blob-deletions.d.ts","sourceRoot":"","sources":["../../src/sync/pending-blob-deletions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACzB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,IAAI,OAAO,CAAC,mBAAmB,EAAE,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAwBD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,OAAO,GACd,mBAAmB,EAAE,CAwBvB;AAED;;;;;GAKG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,qBAAqB,GACxB,wBAAwB,CAgD1B;AAED,wEAAwE;AACxE,wBAAgB,oCAAoC,IAAI,wBAAwB,CAU/E"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
function markerId(key) {
|
|
2
|
+
const range = key.range ? `${key.range.from}-${key.range.to}` : "";
|
|
3
|
+
return `${key.scope}\u0000${key.version ?? ""}\u0000${range}`;
|
|
4
|
+
}
|
|
5
|
+
function normalizeRange(value) {
|
|
6
|
+
if (typeof value !== "object" || value === null)
|
|
7
|
+
return undefined;
|
|
8
|
+
const { from, to } = value;
|
|
9
|
+
if (typeof from !== "string" ||
|
|
10
|
+
typeof to !== "string" ||
|
|
11
|
+
!/^\d+$/.test(from) ||
|
|
12
|
+
!/^\d+$/.test(to) ||
|
|
13
|
+
BigInt(from) > BigInt(to)) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
return { from, to };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Accept the stored value from either marker generation: exact keys
|
|
20
|
+
* (`{ scope, version }`) or the pre-key format that recorded whole scopes,
|
|
21
|
+
* which maps to a version-less marker the retry expands into exact keys.
|
|
22
|
+
*/
|
|
23
|
+
export function normalizePendingBlobDeletions(stored) {
|
|
24
|
+
if (!Array.isArray(stored))
|
|
25
|
+
return [];
|
|
26
|
+
const keys = [];
|
|
27
|
+
for (const item of stored) {
|
|
28
|
+
if (typeof item === "string") {
|
|
29
|
+
keys.push({ scope: item, version: null });
|
|
30
|
+
}
|
|
31
|
+
else if (typeof item === "object" &&
|
|
32
|
+
item !== null &&
|
|
33
|
+
typeof item.scope === "string") {
|
|
34
|
+
const version = item.version;
|
|
35
|
+
const range = typeof version === "string"
|
|
36
|
+
? undefined
|
|
37
|
+
: normalizeRange(item.range);
|
|
38
|
+
keys.push({
|
|
39
|
+
scope: item.scope,
|
|
40
|
+
version: typeof version === "string" ? version : null,
|
|
41
|
+
...(range ? { range } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return keys;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Every operation is a read-modify-write of the whole marker set, so the
|
|
49
|
+
* store serialises them: a delete recording keys while a sync cycle's retry
|
|
50
|
+
* clears others must not lose either update. Ordering is FIFO, and a failed
|
|
51
|
+
* operation never blocks the ones queued behind it.
|
|
52
|
+
*/
|
|
53
|
+
export function createPendingBlobDeletionStore(kv) {
|
|
54
|
+
let queue = Promise.resolve();
|
|
55
|
+
function serialized(operation) {
|
|
56
|
+
const run = queue.then(operation, operation);
|
|
57
|
+
queue = run.catch(() => undefined);
|
|
58
|
+
return run;
|
|
59
|
+
}
|
|
60
|
+
async function current() {
|
|
61
|
+
return normalizePendingBlobDeletions(await kv.read());
|
|
62
|
+
}
|
|
63
|
+
return {
|
|
64
|
+
list() {
|
|
65
|
+
return serialized(current);
|
|
66
|
+
},
|
|
67
|
+
add(keys) {
|
|
68
|
+
return serialized(async () => {
|
|
69
|
+
if (keys.length === 0)
|
|
70
|
+
return;
|
|
71
|
+
const existing = await current();
|
|
72
|
+
const known = new Set(existing.map(markerId));
|
|
73
|
+
const next = [...existing];
|
|
74
|
+
for (const key of keys) {
|
|
75
|
+
const id = markerId(key);
|
|
76
|
+
if (known.has(id))
|
|
77
|
+
continue;
|
|
78
|
+
known.add(id);
|
|
79
|
+
next.push({
|
|
80
|
+
scope: key.scope,
|
|
81
|
+
version: key.version,
|
|
82
|
+
...(key.range ? { range: { ...key.range } } : {}),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
if (next.length === existing.length)
|
|
86
|
+
return;
|
|
87
|
+
await kv.write(next);
|
|
88
|
+
});
|
|
89
|
+
},
|
|
90
|
+
remove(keys) {
|
|
91
|
+
return serialized(async () => {
|
|
92
|
+
if (keys.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
const existing = await current();
|
|
95
|
+
const gone = new Set(keys.map(markerId));
|
|
96
|
+
const next = existing.filter((key) => !gone.has(markerId(key)));
|
|
97
|
+
if (next.length === existing.length)
|
|
98
|
+
return;
|
|
99
|
+
await kv.write(next);
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/** Non-durable store: markers survive only for the process lifetime. */
|
|
105
|
+
export function createMemoryPendingBlobDeletionStore() {
|
|
106
|
+
let keys = [];
|
|
107
|
+
return createPendingBlobDeletionStore({
|
|
108
|
+
async read() {
|
|
109
|
+
return keys;
|
|
110
|
+
},
|
|
111
|
+
async write(next) {
|
|
112
|
+
keys = next.map((key) => ({ ...key }));
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=pending-blob-deletions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-blob-deletions.js","sourceRoot":"","sources":["../../src/sync/pending-blob-deletions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type DownloadAttemptDecision = "attempt" | "backoff" | "give-up";
|
|
2
|
+
export interface DownloadRetryMemoryOptions {
|
|
3
|
+
/** Attempt cap for retryable failures (default 5). */
|
|
4
|
+
maxTransientAttempts?: number;
|
|
5
|
+
/** Base backoff, doubled per failed attempt (default 30s). */
|
|
6
|
+
backoffBaseMs?: number;
|
|
7
|
+
/** Clock override for tests. */
|
|
8
|
+
now?: () => number;
|
|
9
|
+
}
|
|
10
|
+
export declare const DEFAULT_MAX_TRANSIENT_ATTEMPTS = 5;
|
|
11
|
+
export declare const DEFAULT_BACKOFF_BASE_MS = 30000;
|
|
12
|
+
export interface DownloadRetryMemory {
|
|
13
|
+
/** Whether the next download of `key` should run, wait, or never happen. */
|
|
14
|
+
decide(key: string): DownloadAttemptDecision;
|
|
15
|
+
/** Record a failed attempt; `retryable` follows the issue classification. */
|
|
16
|
+
recordFailure(key: string, retryable: boolean): void;
|
|
17
|
+
/** Clear the failure history after a successful download. */
|
|
18
|
+
recordSuccess(key: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* The listing restarted from the beginning (repair pass / full
|
|
21
|
+
* reconcile) — give transient failures a fresh attempt budget so the
|
|
22
|
+
* reset can actually re-fetch what it re-lists. Deterministic (404)
|
|
23
|
+
* entries stay dead: re-listing doesn't make missing bytes appear.
|
|
24
|
+
*/
|
|
25
|
+
onListingReset(): void;
|
|
26
|
+
}
|
|
27
|
+
/** Retry-memory key for a data-point record: id + version. */
|
|
28
|
+
export declare function downloadRetryKey(record: {
|
|
29
|
+
id: string;
|
|
30
|
+
expectedVersion: string;
|
|
31
|
+
}): string;
|
|
32
|
+
export declare function createDownloadRetryMemory(options?: DownloadRetryMemoryOptions): DownloadRetryMemory;
|
|
33
|
+
//# sourceMappingURL=retry-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-memory.d.ts","sourceRoot":"","sources":["../../src/sync/retry-memory.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,uBAAuB,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,0BAA0B;IACzC,sDAAsD;IACtD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,uBAAuB,QAAS,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,4EAA4E;IAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,uBAAuB,CAAC;IAC7C,6EAA6E;IAC7E,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAAC;IACrD,6DAA6D;IAC7D,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;;;OAKG;IACH,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAET;AAQD,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CA4CrB"}
|