Release Next v3.0.0-next.2
Pre-release
Pre-release
·
14 commits
to main
since this release
@cloudpdf/contract@3.0.0-next.2
Minor Changes
-
#730 by @bobsingor – Adds the share-grant contract: standing, revocable authorization decisions that let a document be embedded with no backend.
- Defines
shares.create,shares.list,shares.get,shares.update, andshares.deleteunder/v1/tenants/:tenantId/shares, governed by the newshares.managetenant scope. - Defines
shares.exchangeatPOST /v1/share-sessions, the contract's only unauthenticated operation: the grant row is the authorization, so a public share token trades for a short-lived document session JWT. The registry test now pins that surface, making any future credential-less operation an explicit decision. - Adds an optional
originsallowlist to document-token issuance, so a minted token can be restricted to named web origins. - Adds
tenants.usagefor per-tenant usage facts, plustenants.suspendandtenants.resumefor operator-controlled tenant suspension. - Reports tenant
statuson tenant records and regeneratesopenapi.json, which now carries 44 operations.
- Defines
-
#734 by @bobsingor – Adds the integrity-pinned
init → transfer → commitdocument upload protocol,
including presigned PUT and policy-controlled multipart proxy transfer modes.
@cloudpdf/engine@3.0.0-next.2
Minor Changes
- #730 by @bobsingor – Adds share-session support, the client half of the no-backend embed flow.
- Adds
exchangeShareToken, which trades a public share token for a short-lived document session, andShareExchangeError, whosecodenames the outcome (SharePasswordRequired,OriginNotAllowed,ShareExpired,NotFound). - Adds
shareSessionSource, a caching token source that re-exchanges shortly before expiry and shares one in-flight exchange between concurrent callers. Because the transport resolves its token source on every request and on stream reconnect, renewal needs no timers and no listeners. - Requires no change to
open(): an exchanged session is an ordinary document-scoped JWT, so a share source feedsopen({ kind: 'token' })unchanged, and each open keeps its own credential.
- Adds
@cloudpdf/sdk@3.0.0-next.2
Minor Changes
- #734 by @bobsingor – Adds the generated TypeScript SDK and its high-level
uploads.createworkflow.
It hashes browser and Node.js upload sources, negotiates presigned or proxy
transfer, uploads the bytes, and commits only after integrity verification.
@cloudpdf/server@3.0.0-next.2
Minor Changes
-
#730 by @bobsingor – Implements share grants, origin locking, per-tenant usage, and tenant suspension.
- Stores share grants whose row id is the public share token, carrying document capabilities, an optional origin allowlist, an optional scrypt-hashed passphrase, a session TTL, and an optional expiry. Editing or deleting a grant retargets every embedded copy of its token at the next exchange.
- Serves the public
POST /v1/share-sessionsexchange, which validates origin, passphrase, expiry, disablement, and tenant suspension before minting a document session JWT. Unknown, revoked, disabled, and suspended grants answer alike so the existence of a grant is never disclosed, and the route carries its own per-IP and per-grant limiters rather than the authentication-failure budget. - Enforces an optional
originsclaim on document tokens for every request that arrives with a browserOriginheader, covering both share sessions and backend-minted tokens. Requests without the header are governed by the token itself. - Adds CORS through
CLOUDPDF_CORS_ORIGINS(*to reflect, or a comma-separated allowlist), which browser-direct deployments need. Bearer tokens remain the security boundary; per-credential origin locks carry the origin policy a server-wide list cannot express. - Records per-tenant usage facts for views, uploads, and stored bytes, readable at
GET /v1/tenants/:tenantId/usage. A view is a share exchange or an authorized/v1/accessgrant, counted once across the two. These counters hold no limits and are separate from license metering. - Adds
tenants.suspendandtenants.resume, which fail every tenant JWT, document JWT, and share exchange closed while leaving the root API token free to inspect, resume, or delete the tenant. - Mounts token revocation from the CLI through
CLOUDPDF_ENABLE_REVOCATION. - Records share and suspension lifecycle events in the security-event trail, and adds matching SQLite and PostgreSQL migrations plus origin, passphrase, and end-to-end share coverage.
-
#734 by @bobsingor – Adds integrity-pinned uploads with presigned storage transfer preferred and a
policy-controlled multipart proxy fallback.Hardens filesystem-backed storage against path traversal, storage-root deletion,
and recursive deletion through symbolic links.
@cloudpdf/viewer@3.0.0-next.2
Minor Changes
- #730 by @bobsingor – Accepts public share tokens, so a viewer can be embedded with a dashboard-generated snippet and no backend.
- Adds the
shareTokenandsharePasswordoptions for opening a single shared document. - Adds a cloud
{ kind: 'share' }document source fordocuments, so a multi-tab viewer can mix share tokens, document tokens, and document ids. Each entry exchanges and renews independently, and revoking one share leaves the others untouched. The source is lowered to an ordinary token source before the engine-agnostic viewer core sees it. - Re-exports
exchangeShareToken,shareSessionSource, andShareExchangeErrorso CDN-only consumers can build custom flows, such as prompting for a passphrase before mounting.
- Adds the
@cloudpdf/viewer-react@3.0.0-next.2
Minor Changes
- #730 by @bobsingor – Accepts public share tokens on
CloudPDFViewer, inherited from the cloud vocabulary it already shares with the snippet.- Adds the
shareTokenandsharePasswordprops for rendering a shared document without a backend. - Accepts cloud
{ kind: 'share' }entries indocuments, so a multi-tab viewer can mix share tokens, document tokens, and document ids.
- Adds the