@aglyn/tenant-data-admin 1.0.0-beta.143
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/LICENSE +201 -0
- package/README.md +7 -0
- package/jest.integration.config.d.ts +39 -0
- package/jest.integration.setup.d.ts +17 -0
- package/package.json +51 -0
- package/src/index.d.ts +17 -0
- package/src/index.js +18 -0
- package/src/index.js.map +1 -0
- package/src/lib/render-cache.d.ts +184 -0
- package/src/lib/render-cache.js +198 -0
- package/src/lib/render-cache.js.map +1 -0
- package/src/lib/server/account-addresses.d.ts +160 -0
- package/src/lib/server/account-addresses.js +311 -0
- package/src/lib/server/account-addresses.js.map +1 -0
- package/src/lib/server/account-emails.d.ts +219 -0
- package/src/lib/server/account-emails.js +640 -0
- package/src/lib/server/account-emails.js.map +1 -0
- package/src/lib/server/admin-audit.d.ts +180 -0
- package/src/lib/server/admin-audit.js +233 -0
- package/src/lib/server/admin-audit.js.map +1 -0
- package/src/lib/server/analytics-retention.d.ts +63 -0
- package/src/lib/server/analytics-retention.js +66 -0
- package/src/lib/server/analytics-retention.js.map +1 -0
- package/src/lib/server/api-http.d.ts +159 -0
- package/src/lib/server/api-http.js +230 -0
- package/src/lib/server/api-http.js.map +1 -0
- package/src/lib/server/api-keys.d.ts +117 -0
- package/src/lib/server/api-keys.js +298 -0
- package/src/lib/server/api-keys.js.map +1 -0
- package/src/lib/server/auth-handoff.d.ts +165 -0
- package/src/lib/server/auth-handoff.js +482 -0
- package/src/lib/server/auth-handoff.js.map +1 -0
- package/src/lib/server/auth-pools.d.ts +246 -0
- package/src/lib/server/auth-pools.js +551 -0
- package/src/lib/server/auth-pools.js.map +1 -0
- package/src/lib/server/billing-addons.d.ts +171 -0
- package/src/lib/server/billing-addons.js +277 -0
- package/src/lib/server/billing-addons.js.map +1 -0
- package/src/lib/server/campaign-attribution-store.d.ts +55 -0
- package/src/lib/server/campaign-attribution-store.js +95 -0
- package/src/lib/server/campaign-attribution-store.js.map +1 -0
- package/src/lib/server/campaign-conversion-attribution.d.ts +205 -0
- package/src/lib/server/campaign-conversion-attribution.js +279 -0
- package/src/lib/server/campaign-conversion-attribution.js.map +1 -0
- package/src/lib/server/client-error-report.d.ts +301 -0
- package/src/lib/server/client-error-report.js +755 -0
- package/src/lib/server/client-error-report.js.map +1 -0
- package/src/lib/server/connect-account-status.d.ts +74 -0
- package/src/lib/server/connect-account-status.js +94 -0
- package/src/lib/server/connect-account-status.js.map +1 -0
- package/src/lib/server/connect-payout-failure.d.ts +103 -0
- package/src/lib/server/connect-payout-failure.js +127 -0
- package/src/lib/server/connect-payout-failure.js.map +1 -0
- package/src/lib/server/console-api-rate-limit.d.ts +81 -0
- package/src/lib/server/console-api-rate-limit.js +111 -0
- package/src/lib/server/console-api-rate-limit.js.map +1 -0
- package/src/lib/server/console-domains.d.ts +326 -0
- package/src/lib/server/console-domains.js +779 -0
- package/src/lib/server/console-domains.js.map +1 -0
- package/src/lib/server/consume-once.d.ts +91 -0
- package/src/lib/server/consume-once.js +96 -0
- package/src/lib/server/consume-once.js.map +1 -0
- package/src/lib/server/contact-company-link.d.ts +85 -0
- package/src/lib/server/contact-company-link.js +105 -0
- package/src/lib/server/contact-company-link.js.map +1 -0
- package/src/lib/server/contact-email-engagement.d.ts +32 -0
- package/src/lib/server/contact-email-engagement.js +145 -0
- package/src/lib/server/contact-email-engagement.js.map +1 -0
- package/src/lib/server/contact-email-index.d.ts +56 -0
- package/src/lib/server/contact-email-index.js +158 -0
- package/src/lib/server/contact-email-index.js.map +1 -0
- package/src/lib/server/contact-lifecycle-floor.d.ts +89 -0
- package/src/lib/server/contact-lifecycle-floor.js +88 -0
- package/src/lib/server/contact-lifecycle-floor.js.map +1 -0
- package/src/lib/server/contact-merge.d.ts +55 -0
- package/src/lib/server/contact-merge.js +279 -0
- package/src/lib/server/contact-merge.js.map +1 -0
- package/src/lib/server/contact-suppression.d.ts +153 -0
- package/src/lib/server/contact-suppression.js +259 -0
- package/src/lib/server/contact-suppression.js.map +1 -0
- package/src/lib/server/crm-booking-activity.d.ts +86 -0
- package/src/lib/server/crm-booking-activity.js +251 -0
- package/src/lib/server/crm-booking-activity.js.map +1 -0
- package/src/lib/server/crm-email-activity.d.ts +112 -0
- package/src/lib/server/crm-email-activity.js +143 -0
- package/src/lib/server/crm-email-activity.js.map +1 -0
- package/src/lib/server/crm-inbound-email.d.ts +145 -0
- package/src/lib/server/crm-inbound-email.js +287 -0
- package/src/lib/server/crm-inbound-email.js.map +1 -0
- package/src/lib/server/crm-next-activity.d.ts +74 -0
- package/src/lib/server/crm-next-activity.js +194 -0
- package/src/lib/server/crm-next-activity.js.map +1 -0
- package/src/lib/server/crm-records.d.ts +144 -0
- package/src/lib/server/crm-records.js +218 -0
- package/src/lib/server/crm-records.js.map +1 -0
- package/src/lib/server/csp-aggregate.d.ts +62 -0
- package/src/lib/server/csp-aggregate.js +276 -0
- package/src/lib/server/csp-aggregate.js.map +1 -0
- package/src/lib/server/data-storage-gate.d.ts +66 -0
- package/src/lib/server/data-storage-gate.js +48 -0
- package/src/lib/server/data-storage-gate.js.map +1 -0
- package/src/lib/server/dataset-live-pages.d.ts +179 -0
- package/src/lib/server/dataset-live-pages.js +421 -0
- package/src/lib/server/dataset-live-pages.js.map +1 -0
- package/src/lib/server/dns-probe.d.ts +53 -0
- package/src/lib/server/dns-probe.js +184 -0
- package/src/lib/server/dns-probe.js.map +1 -0
- package/src/lib/server/document-id.d.ts +29 -0
- package/src/lib/server/document-id.js +100 -0
- package/src/lib/server/document-id.js.map +1 -0
- package/src/lib/server/domain-provider-vercel.d.ts +33 -0
- package/src/lib/server/domain-provider-vercel.js +298 -0
- package/src/lib/server/domain-provider-vercel.js.map +1 -0
- package/src/lib/server/domain-provider-webhook.d.ts +73 -0
- package/src/lib/server/domain-provider-webhook.js +223 -0
- package/src/lib/server/domain-provider-webhook.js.map +1 -0
- package/src/lib/server/domain-provider-wildcard.d.ts +54 -0
- package/src/lib/server/domain-provider-wildcard.js +163 -0
- package/src/lib/server/domain-provider-wildcard.js.map +1 -0
- package/src/lib/server/domain-provider.d.ts +197 -0
- package/src/lib/server/domain-provider.js +221 -0
- package/src/lib/server/domain-provider.js.map +1 -0
- package/src/lib/server/duplicate-activity.d.ts +54 -0
- package/src/lib/server/duplicate-activity.js +67 -0
- package/src/lib/server/duplicate-activity.js.map +1 -0
- package/src/lib/server/duplicate-resource.d.ts +55 -0
- package/src/lib/server/duplicate-resource.js +474 -0
- package/src/lib/server/duplicate-resource.js.map +1 -0
- package/src/lib/server/dynamic-list-materialize.d.ts +153 -0
- package/src/lib/server/dynamic-list-materialize.js +581 -0
- package/src/lib/server/dynamic-list-materialize.js.map +1 -0
- package/src/lib/server/edit-access-authz.d.ts +56 -0
- package/src/lib/server/edit-access-authz.js +107 -0
- package/src/lib/server/edit-access-authz.js.map +1 -0
- package/src/lib/server/edit-access-token.d.ts +72 -0
- package/src/lib/server/edit-access-token.js +116 -0
- package/src/lib/server/edit-access-token.js.map +1 -0
- package/src/lib/server/edit-hint-token.d.ts +83 -0
- package/src/lib/server/edit-hint-token.js +119 -0
- package/src/lib/server/edit-hint-token.js.map +1 -0
- package/src/lib/server/email-delivery-log.d.ts +509 -0
- package/src/lib/server/email-delivery-log.js +1043 -0
- package/src/lib/server/email-delivery-log.js.map +1 -0
- package/src/lib/server/email-flow-gate.d.ts +80 -0
- package/src/lib/server/email-flow-gate.js +153 -0
- package/src/lib/server/email-flow-gate.js.map +1 -0
- package/src/lib/server/email-marketing-gate.d.ts +333 -0
- package/src/lib/server/email-marketing-gate.js +639 -0
- package/src/lib/server/email-marketing-gate.js.map +1 -0
- package/src/lib/server/email-metering.d.ts +293 -0
- package/src/lib/server/email-metering.js +359 -0
- package/src/lib/server/email-metering.js.map +1 -0
- package/src/lib/server/email-revenue-attribution.d.ts +185 -0
- package/src/lib/server/email-revenue-attribution.js +300 -0
- package/src/lib/server/email-revenue-attribution.js.map +1 -0
- package/src/lib/server/email-send-rate.d.ts +232 -0
- package/src/lib/server/email-send-rate.js +417 -0
- package/src/lib/server/email-send-rate.js.map +1 -0
- package/src/lib/server/email-sender-reputation.d.ts +317 -0
- package/src/lib/server/email-sender-reputation.js +464 -0
- package/src/lib/server/email-sender-reputation.js.map +1 -0
- package/src/lib/server/email-suppression.d.ts +490 -0
- package/src/lib/server/email-suppression.js +648 -0
- package/src/lib/server/email-suppression.js.map +1 -0
- package/src/lib/server/email-topic-confirmation.d.ts +150 -0
- package/src/lib/server/email-topic-confirmation.js +272 -0
- package/src/lib/server/email-topic-confirmation.js.map +1 -0
- package/src/lib/server/email-unsubscribe-link.d.ts +174 -0
- package/src/lib/server/email-unsubscribe-link.js +236 -0
- package/src/lib/server/email-unsubscribe-link.js.map +1 -0
- package/src/lib/server/erase-person.d.ts +116 -0
- package/src/lib/server/erase-person.js +272 -0
- package/src/lib/server/erase-person.js.map +1 -0
- package/src/lib/server/erase.d.ts +458 -0
- package/src/lib/server/erase.js +1506 -0
- package/src/lib/server/erase.js.map +1 -0
- package/src/lib/server/firebase-admin.d.ts +71 -0
- package/src/lib/server/firebase-admin.js +343 -0
- package/src/lib/server/firebase-admin.js.map +1 -0
- package/src/lib/server/form-dataset-binding-token.d.ts +35 -0
- package/src/lib/server/form-dataset-binding-token.js +107 -0
- package/src/lib/server/form-dataset-binding-token.js.map +1 -0
- package/src/lib/server/free-workspace-cap.d.ts +201 -0
- package/src/lib/server/free-workspace-cap.js +404 -0
- package/src/lib/server/free-workspace-cap.js.map +1 -0
- package/src/lib/server/ga4-measurement-protocol.d.ts +256 -0
- package/src/lib/server/ga4-measurement-protocol.js +558 -0
- package/src/lib/server/ga4-measurement-protocol.js.map +1 -0
- package/src/lib/server/host-email-tokens.d.ts +47 -0
- package/src/lib/server/host-email-tokens.js +72 -0
- package/src/lib/server/host-email-tokens.js.map +1 -0
- package/src/lib/server/host-memberships.d.ts +54 -0
- package/src/lib/server/host-memberships.js +194 -0
- package/src/lib/server/host-memberships.js.map +1 -0
- package/src/lib/server/host-sending-domain.d.ts +292 -0
- package/src/lib/server/host-sending-domain.js +451 -0
- package/src/lib/server/host-sending-domain.js.map +1 -0
- package/src/lib/server/host-visitor-records.d.ts +150 -0
- package/src/lib/server/host-visitor-records.js +262 -0
- package/src/lib/server/host-visitor-records.js.map +1 -0
- package/src/lib/server/id-token-refusal.d.ts +28 -0
- package/src/lib/server/id-token-refusal.js +111 -0
- package/src/lib/server/id-token-refusal.js.map +1 -0
- package/src/lib/server/legal-acceptance.d.ts +214 -0
- package/src/lib/server/legal-acceptance.js +305 -0
- package/src/lib/server/legal-acceptance.js.map +1 -0
- package/src/lib/server/list-members.d.ts +211 -0
- package/src/lib/server/list-members.js +176 -0
- package/src/lib/server/list-members.js.map +1 -0
- package/src/lib/server/live-page-usage.d.ts +202 -0
- package/src/lib/server/live-page-usage.js +300 -0
- package/src/lib/server/live-page-usage.js.map +1 -0
- package/src/lib/server/lockdown.d.ts +313 -0
- package/src/lib/server/lockdown.js +643 -0
- package/src/lib/server/lockdown.js.map +1 -0
- package/src/lib/server/media-cdn-rate-limit.d.ts +188 -0
- package/src/lib/server/media-cdn-rate-limit.js +204 -0
- package/src/lib/server/media-cdn-rate-limit.js.map +1 -0
- package/src/lib/server/media-delivery.d.ts +267 -0
- package/src/lib/server/media-delivery.js +485 -0
- package/src/lib/server/media-delivery.js.map +1 -0
- package/src/lib/server/media-download-tokens.d.ts +161 -0
- package/src/lib/server/media-download-tokens.js +386 -0
- package/src/lib/server/media-download-tokens.js.map +1 -0
- package/src/lib/server/media-quarantine.d.ts +127 -0
- package/src/lib/server/media-quarantine.js +170 -0
- package/src/lib/server/media-quarantine.js.map +1 -0
- package/src/lib/server/media-signing.d.ts +126 -0
- package/src/lib/server/media-signing.js +159 -0
- package/src/lib/server/media-signing.js.map +1 -0
- package/src/lib/server/media-storage-path.d.ts +96 -0
- package/src/lib/server/media-storage-path.js +111 -0
- package/src/lib/server/media-storage-path.js.map +1 -0
- package/src/lib/server/media-strong-digest.d.ts +85 -0
- package/src/lib/server/media-strong-digest.js +190 -0
- package/src/lib/server/media-strong-digest.js.map +1 -0
- package/src/lib/server/media-tombstone.d.ts +276 -0
- package/src/lib/server/media-tombstone.js +421 -0
- package/src/lib/server/media-tombstone.js.map +1 -0
- package/src/lib/server/media-variants.d.ts +309 -0
- package/src/lib/server/media-variants.js +428 -0
- package/src/lib/server/media-variants.js.map +1 -0
- package/src/lib/server/member-email-aliases.d.ts +180 -0
- package/src/lib/server/member-email-aliases.js +420 -0
- package/src/lib/server/member-email-aliases.js.map +1 -0
- package/src/lib/server/member-photo.d.ts +88 -0
- package/src/lib/server/member-photo.js +185 -0
- package/src/lib/server/member-photo.js.map +1 -0
- package/src/lib/server/membership-recover-throttle.d.ts +211 -0
- package/src/lib/server/membership-recover-throttle.js +231 -0
- package/src/lib/server/membership-recover-throttle.js.map +1 -0
- package/src/lib/server/notifications.d.ts +55 -0
- package/src/lib/server/notifications.js +134 -0
- package/src/lib/server/notifications.js.map +1 -0
- package/src/lib/server/org-billing.d.ts +97 -0
- package/src/lib/server/org-billing.js +236 -0
- package/src/lib/server/org-billing.js.map +1 -0
- package/src/lib/server/organizations.d.ts +837 -0
- package/src/lib/server/organizations.js +1814 -0
- package/src/lib/server/organizations.js.map +1 -0
- package/src/lib/server/password-reset-throttle.d.ts +84 -0
- package/src/lib/server/password-reset-throttle.js +102 -0
- package/src/lib/server/password-reset-throttle.js.map +1 -0
- package/src/lib/server/personal-data-export.d.ts +241 -0
- package/src/lib/server/personal-data-export.js +858 -0
- package/src/lib/server/personal-data-export.js.map +1 -0
- package/src/lib/server/platform-domain-names.d.ts +62 -0
- package/src/lib/server/platform-domain-names.js +197 -0
- package/src/lib/server/platform-domain-names.js.map +1 -0
- package/src/lib/server/platform-marketing-consent.d.ts +133 -0
- package/src/lib/server/platform-marketing-consent.js +209 -0
- package/src/lib/server/platform-marketing-consent.js.map +1 -0
- package/src/lib/server/rate-limit-store.d.ts +702 -0
- package/src/lib/server/rate-limit-store.js +1220 -0
- package/src/lib/server/rate-limit-store.js.map +1 -0
- package/src/lib/server/realm-plugins.d.ts +67 -0
- package/src/lib/server/realm-plugins.js +250 -0
- package/src/lib/server/realm-plugins.js.map +1 -0
- package/src/lib/server/recaptcha-allowlist.d.ts +90 -0
- package/src/lib/server/recaptcha-allowlist.js +409 -0
- package/src/lib/server/recaptcha-allowlist.js.map +1 -0
- package/src/lib/server/release-flags.d.ts +105 -0
- package/src/lib/server/release-flags.js +183 -0
- package/src/lib/server/release-flags.js.map +1 -0
- package/src/lib/server/replay-erasures.d.ts +126 -0
- package/src/lib/server/replay-erasures.js +217 -0
- package/src/lib/server/replay-erasures.js.map +1 -0
- package/src/lib/server/resolve-people.d.ts +66 -0
- package/src/lib/server/resolve-people.js +112 -0
- package/src/lib/server/resolve-people.js.map +1 -0
- package/src/lib/server/safe-equal.d.ts +45 -0
- package/src/lib/server/safe-equal.js +58 -0
- package/src/lib/server/safe-equal.js.map +1 -0
- package/src/lib/server/sending-domain-debt.d.ts +127 -0
- package/src/lib/server/sending-domain-debt.js +268 -0
- package/src/lib/server/sending-domain-debt.js.map +1 -0
- package/src/lib/server/sending-domain-recheck.d.ts +151 -0
- package/src/lib/server/sending-domain-recheck.js +253 -0
- package/src/lib/server/sending-domain-recheck.js.map +1 -0
- package/src/lib/server/sending-domains.d.ts +364 -0
- package/src/lib/server/sending-domains.js +683 -0
- package/src/lib/server/sending-domains.js.map +1 -0
- package/src/lib/server/serve-media-cdn.d.ts +433 -0
- package/src/lib/server/serve-media-cdn.js +1370 -0
- package/src/lib/server/serve-media-cdn.js.map +1 -0
- package/src/lib/server/serve-plugin-fetch.d.ts +61 -0
- package/src/lib/server/serve-plugin-fetch.js +294 -0
- package/src/lib/server/serve-plugin-fetch.js.map +1 -0
- package/src/lib/server/sms-keywords.d.ts +63 -0
- package/src/lib/server/sms-keywords.js +146 -0
- package/src/lib/server/sms-keywords.js.map +1 -0
- package/src/lib/server/sso-break-glass-owners.d.ts +91 -0
- package/src/lib/server/sso-break-glass-owners.js +227 -0
- package/src/lib/server/sso-break-glass-owners.js.map +1 -0
- package/src/lib/server/sso-domain-policy.d.ts +140 -0
- package/src/lib/server/sso-domain-policy.js +239 -0
- package/src/lib/server/sso-domain-policy.js.map +1 -0
- package/src/lib/server/sso-drift-logic.d.ts +106 -0
- package/src/lib/server/sso-drift-logic.js +95 -0
- package/src/lib/server/sso-drift-logic.js.map +1 -0
- package/src/lib/server/sso-enforcement.d.ts +204 -0
- package/src/lib/server/sso-enforcement.js +309 -0
- package/src/lib/server/sso-enforcement.js.map +1 -0
- package/src/lib/server/sso-provisioning.d.ts +320 -0
- package/src/lib/server/sso-provisioning.js +715 -0
- package/src/lib/server/sso-provisioning.js.map +1 -0
- package/src/lib/server/staff-alert-email.d.ts +41 -0
- package/src/lib/server/staff-alert-email.js +63 -0
- package/src/lib/server/staff-alert-email.js.map +1 -0
- package/src/lib/server/stripe-account-mode.d.ts +156 -0
- package/src/lib/server/stripe-account-mode.js +162 -0
- package/src/lib/server/stripe-account-mode.js.map +1 -0
- package/src/lib/server/tenant-write-lockdown.d.ts +131 -0
- package/src/lib/server/tenant-write-lockdown.js +176 -0
- package/src/lib/server/tenant-write-lockdown.js.map +1 -0
- package/src/lib/server/test-firestore.d.ts +45 -0
- package/src/lib/server/test-firestore.js +124 -0
- package/src/lib/server/test-firestore.js.map +1 -0
- package/src/lib/server/token-revocation.d.ts +140 -0
- package/src/lib/server/token-revocation.js +255 -0
- package/src/lib/server/token-revocation.js.map +1 -0
- package/src/lib/server/update-existing.d.ts +32 -0
- package/src/lib/server/update-existing.js +73 -0
- package/src/lib/server/update-existing.js.map +1 -0
- package/src/lib/server/upload-cors-reconcile.d.ts +118 -0
- package/src/lib/server/upload-cors-reconcile.js +234 -0
- package/src/lib/server/upload-cors-reconcile.js.map +1 -0
- package/src/lib/server/upsert-contact.d.ts +262 -0
- package/src/lib/server/upsert-contact.js +546 -0
- package/src/lib/server/upsert-contact.js.map +1 -0
- package/src/lib/server/usage-invoice.d.ts +203 -0
- package/src/lib/server/usage-invoice.js +397 -0
- package/src/lib/server/usage-invoice.js.map +1 -0
- package/src/lib/server/user-profiles.d.ts +151 -0
- package/src/lib/server/user-profiles.js +364 -0
- package/src/lib/server/user-profiles.js.map +1 -0
- package/src/lib/server/vercel-drain-signature.d.ts +30 -0
- package/src/lib/server/vercel-drain-signature.js +61 -0
- package/src/lib/server/vercel-drain-signature.js.map +1 -0
- package/src/lib/server/vercel-log-drain.d.ts +259 -0
- package/src/lib/server/vercel-log-drain.js +479 -0
- package/src/lib/server/vercel-log-drain.js.map +1 -0
- package/src/lib/server/verify-email-cooldown.d.ts +102 -0
- package/src/lib/server/verify-email-cooldown.js +114 -0
- package/src/lib/server/verify-email-cooldown.js.map +1 -0
- package/src/lib/server/visitor-write-rate-limit.d.ts +87 -0
- package/src/lib/server/visitor-write-rate-limit.js +117 -0
- package/src/lib/server/visitor-write-rate-limit.js.map +1 -0
- package/src/lib/server/workspace-domains.d.ts +156 -0
- package/src/lib/server/workspace-domains.js +271 -0
- package/src/lib/server/workspace-domains.js.map +1 -0
- package/src/tenancy.d.ts +115 -0
- package/src/tenancy.js +142 -0
- package/src/tenancy.js.map +1 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type MediaVideoRendition } from '@aglyn/aglyn/app-utils/media-ref';
|
|
18
|
+
import type { ReleaseFlagKey } from '@aglyn/aglyn/app-utils/release-flags';
|
|
19
|
+
import { type MediaDeliveryClaims, type MediaDeliveryProvider } from '@aglyn/aglyn/plugin-manager/media-delivery-provider';
|
|
20
|
+
/**
|
|
21
|
+
* Video delivered from the configured delivery provider (AGL-2824): the
|
|
22
|
+
* platform's half.
|
|
23
|
+
*
|
|
24
|
+
* `serveMediaCdn` keeps every access decision it has always made. When a
|
|
25
|
+
* video request passes all of them, and this module finds a current copy of
|
|
26
|
+
* the requested representation at the delivery provider, the CDN answers
|
|
27
|
+
* with a `302` to a short-lived signed URL on the provider's host instead of
|
|
28
|
+
* streaming the bytes itself. The commerce stream mints the same URL for a
|
|
29
|
+
* buyer. Everything else — images, posters, downloads, and every video with
|
|
30
|
+
* no current copy — serves exactly as it did.
|
|
31
|
+
*
|
|
32
|
+
* ## Three switches, all of which must be on
|
|
33
|
+
*
|
|
34
|
+
* 1. **A provider.** A plugin registers one against core's contract
|
|
35
|
+
* (`media-delivery-provider`), and it must be configured for the
|
|
36
|
+
* capability in question: `store` to copy or remove, `deliver` to mint.
|
|
37
|
+
* With none, every function here returns before any I/O.
|
|
38
|
+
* 2. **The release flag**, per org: {@link MEDIA_DELIVERY_RELEASE_FLAG}. It
|
|
39
|
+
* gates the COPY as well as the redirect, because a copy is customer data
|
|
40
|
+
* at the provider. Removal is never gated: a copy made while the flag was
|
|
41
|
+
* on must still go when its asset does.
|
|
42
|
+
* 3. **A current copy**, recorded on the media document under
|
|
43
|
+
* {@link MEDIA_DELIVERY_COPIES_FIELD}. A copy is current when it was made
|
|
44
|
+
* from the asset's present `contentHash` and its key is the one this
|
|
45
|
+
* module derives for the asset. A replace changes the hash, so every copy
|
|
46
|
+
* of the previous bytes stops being served in the same write, before
|
|
47
|
+
* anything at the provider is removed.
|
|
48
|
+
*
|
|
49
|
+
* ## The platform stays the system of record
|
|
50
|
+
*
|
|
51
|
+
* The bucket keeps every byte it kept before, and the storage counter moves
|
|
52
|
+
* exactly as it did: a copy's size is recorded on the copy and never added to
|
|
53
|
+
* `counters/media`, so storage is billed once. Making the provider's copy the
|
|
54
|
+
* only one is a later step, and the storage cost model depends on it (see
|
|
55
|
+
* AGL-2825); nothing here deletes a platform object.
|
|
56
|
+
*
|
|
57
|
+
* ## Keys carry the content hash
|
|
58
|
+
*
|
|
59
|
+
* `{hosts|orgs}/{scopeId}/{mediaId}/{sourceHash}/{representation}/{objectHash}`.
|
|
60
|
+
* The source hash is the asset's `contentHash`; the object hash is the
|
|
61
|
+
* copied object's own digest (for the master the two are the same). A
|
|
62
|
+
* replaced file or a re-encoded rendition therefore gets a new key, so a URL
|
|
63
|
+
* minted for old bytes can never be answered with new ones, and the whole
|
|
64
|
+
* asset is one prefix for removal. The record is written by the server only,
|
|
65
|
+
* but the key it holds is checked against the derivation before it is used:
|
|
66
|
+
* a record copied onto another document names a key that is not that
|
|
67
|
+
* document's own, and is ignored.
|
|
68
|
+
*/
|
|
69
|
+
/** The per-org release flag both halves — copy and redirect — ask. */
|
|
70
|
+
export declare const MEDIA_DELIVERY_RELEASE_FLAG: ReleaseFlagKey;
|
|
71
|
+
/** The media document field that records the copies at the provider. */
|
|
72
|
+
export declare const MEDIA_DELIVERY_COPIES_FIELD = "deliveryCopies";
|
|
73
|
+
/** The representation name of the uploaded file itself. */
|
|
74
|
+
export declare const MEDIA_DELIVERY_MASTER = "master";
|
|
75
|
+
/**
|
|
76
|
+
* The shortest delivery URL lifetime. A delivery URL is a bearer capability,
|
|
77
|
+
* so it is short, but a player sends its range requests to the URL it was
|
|
78
|
+
* redirected to, so it must outlive a sitting: seeking, pausing and resuming
|
|
79
|
+
* all reuse it.
|
|
80
|
+
*/
|
|
81
|
+
export declare const MEDIA_DELIVERY_MIN_TTL_MS: number;
|
|
82
|
+
/** The lifetime when the film's duration is unknown. */
|
|
83
|
+
export declare const MEDIA_DELIVERY_DEFAULT_TTL_MS: number;
|
|
84
|
+
/** The longest lifetime, shared with every other signed media link. */
|
|
85
|
+
export declare const MEDIA_DELIVERY_MAX_TTL_MS: number;
|
|
86
|
+
/**
|
|
87
|
+
* How long a delivery URL for a film of `durationMs` lives: twice the film,
|
|
88
|
+
* so a viewer who pauses halfway still finishes it, between
|
|
89
|
+
* {@link MEDIA_DELIVERY_MIN_TTL_MS} and {@link MEDIA_DELIVERY_MAX_TTL_MS}.
|
|
90
|
+
*/
|
|
91
|
+
export declare function mediaDeliveryTtlMs(durationMs: unknown): number;
|
|
92
|
+
/** The asset a copy belongs to. */
|
|
93
|
+
export interface MediaDeliveryAsset {
|
|
94
|
+
collection: 'hosts' | 'orgs';
|
|
95
|
+
scopeId: string;
|
|
96
|
+
mediaId: string;
|
|
97
|
+
}
|
|
98
|
+
/** The representation a rendition (or the master, for none) is copied as. */
|
|
99
|
+
export declare function mediaDeliveryRepresentation(rendition: Pick<MediaVideoRendition, 'key'> | null | undefined): string;
|
|
100
|
+
/**
|
|
101
|
+
* The prefix every copy of one asset lives under, or null for an asset whose
|
|
102
|
+
* identity does not fit the grammar. Ends in `/`, so one asset's prefix is
|
|
103
|
+
* never another's.
|
|
104
|
+
*/
|
|
105
|
+
export declare function mediaDeliveryAssetPrefix(asset: MediaDeliveryAsset): string | null;
|
|
106
|
+
/** The prefix every copy of one library lives under, for an erasure. */
|
|
107
|
+
export declare function mediaDeliveryScopePrefix(collection: 'hosts' | 'orgs', scopeId: string): string | null;
|
|
108
|
+
/** The object key of one copy, or null when a part does not fit the grammar. */
|
|
109
|
+
export declare function mediaDeliveryObjectKey(asset: MediaDeliveryAsset, copy: {
|
|
110
|
+
sourceHash: string;
|
|
111
|
+
representation: string;
|
|
112
|
+
objectHash: string;
|
|
113
|
+
}): string | null;
|
|
114
|
+
/** One copy at the provider, as the media document records it. */
|
|
115
|
+
export interface MediaDeliveryCopy {
|
|
116
|
+
key: string;
|
|
117
|
+
/** The asset's `contentHash` when the copy was made. */
|
|
118
|
+
sourceHash: string;
|
|
119
|
+
/** The copied object's own digest. */
|
|
120
|
+
objectHash: string;
|
|
121
|
+
contentType: string;
|
|
122
|
+
sizeBytes: number;
|
|
123
|
+
copiedAtMs: number;
|
|
124
|
+
}
|
|
125
|
+
/** The recorded copies of one asset, by representation. */
|
|
126
|
+
export type MediaDeliveryCopies = Record<string, MediaDeliveryCopy>;
|
|
127
|
+
/**
|
|
128
|
+
* The copies a media document records that belong to THIS asset: each entry
|
|
129
|
+
* well formed, and its key exactly the one {@link mediaDeliveryObjectKey}
|
|
130
|
+
* derives from its own fields. Anything else is dropped rather than trusted.
|
|
131
|
+
*/
|
|
132
|
+
export declare function parseMediaDeliveryCopies(raw: unknown, asset: MediaDeliveryAsset): MediaDeliveryCopies;
|
|
133
|
+
/** Whether a served type is one this module delivers: video, nothing else. */
|
|
134
|
+
export declare function isMediaDeliveryType(contentType: unknown): boolean;
|
|
135
|
+
/** Drops the host → org cache. Tests need it between cases. */
|
|
136
|
+
export declare function invalidateMediaDeliveryOrgCache(): void;
|
|
137
|
+
/**
|
|
138
|
+
* The org that owns a library: the id itself for an org library, and the
|
|
139
|
+
* host's `hostIndex` entry for a site's. Cached for a minute, like the
|
|
140
|
+
* release-flag reads it feeds; a failed read answers null, which the flag
|
|
141
|
+
* treats as "no org" and so refuses anything short of a full release.
|
|
142
|
+
*/
|
|
143
|
+
export declare function mediaDeliveryOrgIdFor(collection: 'hosts' | 'orgs', scopeId: string): Promise<string | null>;
|
|
144
|
+
/** The flag verdict for one org. */
|
|
145
|
+
export declare function mediaDeliveryEnabledForOrg(orgId: string | null): Promise<boolean>;
|
|
146
|
+
export interface MediaDeliveryRedirect {
|
|
147
|
+
location: string;
|
|
148
|
+
expiresAtMs: number;
|
|
149
|
+
key: string;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The delivery URL for one representation of one asset, or null when the
|
|
153
|
+
* request must be served the way it always was.
|
|
154
|
+
*
|
|
155
|
+
* Called only after the caller has made every access decision. Null for: a
|
|
156
|
+
* type that is not video; an asset with no current copy of this
|
|
157
|
+
* representation; the flag off for the owning org; a lifetime that has
|
|
158
|
+
* already run out; and a provider that fails to mint. The cheap answers come
|
|
159
|
+
* first, so an asset with no copy costs no read at all.
|
|
160
|
+
*/
|
|
161
|
+
export declare function mediaDeliveryRedirect(input: {
|
|
162
|
+
provider: MediaDeliveryProvider;
|
|
163
|
+
asset: MediaDeliveryAsset;
|
|
164
|
+
document: {
|
|
165
|
+
get(field: string): unknown;
|
|
166
|
+
};
|
|
167
|
+
/** The rendition being served, or none for the master. */
|
|
168
|
+
rendition?: Pick<MediaVideoRendition, 'key'> | null;
|
|
169
|
+
servedType: unknown;
|
|
170
|
+
claims: Omit<MediaDeliveryClaims, 'orgId'>;
|
|
171
|
+
/** The owning org, asked only once a current copy is found. */
|
|
172
|
+
orgId: () => Promise<string | null>;
|
|
173
|
+
/** Defaults to the release flag. */
|
|
174
|
+
deliveryEnabled?: (orgId: string | null) => Promise<boolean>;
|
|
175
|
+
/** The URL may not outlive this, e.g. the signature the request carried. */
|
|
176
|
+
notAfterMs?: number;
|
|
177
|
+
/** A fixed lifetime; otherwise {@link mediaDeliveryTtlMs} of the film. */
|
|
178
|
+
ttlMs?: number;
|
|
179
|
+
nowMs?: number;
|
|
180
|
+
}): Promise<MediaDeliveryRedirect | null>;
|
|
181
|
+
/** The slice of a Storage file the copy reads. */
|
|
182
|
+
export interface MediaDeliverySourceFile {
|
|
183
|
+
getMetadata(): Promise<unknown>;
|
|
184
|
+
createReadStream(): NodeJS.ReadableStream;
|
|
185
|
+
}
|
|
186
|
+
/** The slice of a Storage bucket the copy reads. */
|
|
187
|
+
export interface MediaDeliverySourceBucket {
|
|
188
|
+
file(path: string): MediaDeliverySourceFile;
|
|
189
|
+
}
|
|
190
|
+
export type MediaDeliverySyncStatus = 'no-provider' | 'no-asset' | 'not-video' | 'no-hash' | 'disabled' | 'replaced' | 'synced';
|
|
191
|
+
export interface MediaDeliverySyncResult {
|
|
192
|
+
status: MediaDeliverySyncStatus;
|
|
193
|
+
/** Representations copied by this call. */
|
|
194
|
+
copied: string[];
|
|
195
|
+
/** Representations whose current copy was already there. */
|
|
196
|
+
kept: string[];
|
|
197
|
+
/** Keys removed from the provider because nothing current names them. */
|
|
198
|
+
removed: string[];
|
|
199
|
+
/** Representations whose copy failed; they keep serving from the platform. */
|
|
200
|
+
failed: string[];
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Brings the provider's copies of one video in line with its document: every
|
|
204
|
+
* representation the document serves — the master and each recorded
|
|
205
|
+
* rendition — gets a copy made from its current bytes, and a copy nothing
|
|
206
|
+
* current names is removed.
|
|
207
|
+
*
|
|
208
|
+
* Every copy path runs through here: an upload's finalize, a replace, a
|
|
209
|
+
* restore and the rendition producer. It is safe to run again at any time.
|
|
210
|
+
* The master's copy is current when it was made from the asset's
|
|
211
|
+
* `contentHash`; a rendition's when it was made from that hash AND from the
|
|
212
|
+
* rendition object Storage holds now, since the producer can encode a key
|
|
213
|
+
* again without the master changing.
|
|
214
|
+
*
|
|
215
|
+
* The record is written in a transaction that re-reads the document, and
|
|
216
|
+
* only while the asset still has the content hash the copies were made from.
|
|
217
|
+
* An asset replaced or deleted while its copies were uploading keeps that
|
|
218
|
+
* state, and the copies just made are removed rather than recorded against
|
|
219
|
+
* bytes they are not.
|
|
220
|
+
*/
|
|
221
|
+
export declare function syncMediaDeliveryCopies(options: {
|
|
222
|
+
docRef: FirebaseFirestore.DocumentReference;
|
|
223
|
+
asset: MediaDeliveryAsset;
|
|
224
|
+
bucket: MediaDeliverySourceBucket;
|
|
225
|
+
/** The owning org, when the caller has it; otherwise resolved. */
|
|
226
|
+
orgId?: string | null;
|
|
227
|
+
/** Defaults to the registered provider configured to store. */
|
|
228
|
+
provider?: MediaDeliveryProvider | null;
|
|
229
|
+
/** Defaults to the release flag. */
|
|
230
|
+
deliveryEnabled?: (orgId: string | null) => Promise<boolean>;
|
|
231
|
+
nowMs?: () => number;
|
|
232
|
+
}): Promise<MediaDeliverySyncResult>;
|
|
233
|
+
/**
|
|
234
|
+
* Removes every copy of one asset from the provider: a delete, a takedown and
|
|
235
|
+
* a replace all end the life of the bytes the copies were made from.
|
|
236
|
+
*
|
|
237
|
+
* By prefix rather than by the document's record, so a copy the record lost
|
|
238
|
+
* track of goes too. Never gated on the flag, since copies made while it was
|
|
239
|
+
* on must still go, and never throws: the caller's own action has already
|
|
240
|
+
* happened and must not be reported as failed because a copy lingered. Null
|
|
241
|
+
* when no provider is configured to store.
|
|
242
|
+
*/
|
|
243
|
+
export declare function removeMediaDeliveryCopies(options: {
|
|
244
|
+
asset: MediaDeliveryAsset;
|
|
245
|
+
provider?: MediaDeliveryProvider | null;
|
|
246
|
+
}): Promise<{
|
|
247
|
+
removed: number;
|
|
248
|
+
failed: boolean;
|
|
249
|
+
} | null>;
|
|
250
|
+
/**
|
|
251
|
+
* Removes every copy a library holds at the provider — the erasure of a site
|
|
252
|
+
* or an org. Same posture as {@link removeMediaDeliveryCopies}.
|
|
253
|
+
*/
|
|
254
|
+
export declare function eraseMediaDeliveryScope(options: {
|
|
255
|
+
collection: 'hosts' | 'orgs';
|
|
256
|
+
scopeId: string;
|
|
257
|
+
provider?: MediaDeliveryProvider | null;
|
|
258
|
+
}): Promise<{
|
|
259
|
+
removed: number;
|
|
260
|
+
failed: boolean;
|
|
261
|
+
} | null>;
|
|
262
|
+
/**
|
|
263
|
+
* A media document without its copy record, for a restore: the delete that
|
|
264
|
+
* made the tombstone removed the copies, so the record describes objects
|
|
265
|
+
* that are gone.
|
|
266
|
+
*/
|
|
267
|
+
export declare function withoutMediaDeliveryCopies(media: Record<string, unknown>): Record<string, unknown>;
|