Repository navigation
Release Next v3.0.0-next.23
Pre-release@cloudpdf/contract@3.0.0-next.23
Minor Changes
-
#991 by @bobsingor – The manifest and a mutation's
cacheDeltahavecontentsVersion, the document-wide pin of every page's content. -
#989 by @bobsingor –
GET …/headanswersengine, the server's engine value for each kind of cached read. The manifest no longer hasserverFonts. -
#994 by @bobsingor – Every error response is the one error body,
ErrorResponse, with its errorEngineError;AdminErrorPayloadSchemaandAdminThumbnailUnavailablePayloadSchemaare gone, and a thumbnail that isn't ready says its state indetails.state. Operations no longer get a type per error status, so a response type is named after its operation alone (DocFormsListResponse, notDocFormsList200Response). Sizes, counts, durations and the admin timestamps are integers.nextCursor,thumbnailStateandthumbnailUrlare always there, and the license status'slicense,reportingandusagetoo (nullwhen there's nothing). A union of whole-number literals, such as a rotation or a DocMDP level, is one integer enum inopenapi.json. -
#996 by @bobsingor – Every point in time is an ISO 8601 string (
format: date-time):createdAt,updatedAt,archivedAt,lastExchangedAt,firstSeenAt,lastSeenAtandconsentedAton tenants, documents, folders, grants, layers and visitors, and everyexpiresAt(grants, the upload URL, tokens, grant sessions, download links), which were milliseconds in some places and seconds in others. A request gives one with its offset: a grant'sexpiresAt, and a token revoke'sexpiresAt, which replacesexpiresAtSeconds. A date a write takes as aDatein process is a date-time string inopenapi.json. A schema a model reuses no longer takes thenullableof the field that used it first: a grant'screatedAtandupdatedAt, and a visitor'sfirstSeenAtandlastSeenAt, read as non-null. -
#997 by @bobsingor – Names and units follow one rule: a document's
baseShaandstorageSizeBytesarebaseSha256andsizeBytes, and so is a layer's and a visitor's layer'sstorageSizeBytes; the init request'scontentLengthanduploadTtlSecaresizeBytesanduploadTtlSeconds; token issue's and the download link'sexpiresInisexpiresInSeconds; folders move-into takesdocIds(its 404 namesdetails.docIds); usagemetricsarepdfViews,pdfUploadsandstorageBytes, and a module's meters move to their ownmoduleMetersmap; and the path parameters are{docId},{annotationKey},{sha256}and{displaySha256}(the URLs don't change). -
#995 by @bobsingor – A destination's axes are always there,
nullto keep the viewer's value, and a document'sopenDestinationis always there. A line'scaptionEnabledis a boolean, nevernull. A grant create takesnullfororiginsandexpiresAt, as a grant read says them, meaning any origin and no expiry. -
#1005 by @bobsingor – A document head's
permissions.flags(the namedPdfPermissionFlags) replaces the rawbitsword. -
#982 by @bobsingor – A widget reads
hasMark:truewhen it is a signature field's widget with a
mark in it, because the field is signed or a mark was drawn in. Such a widget
shows the mark, and a change to its style is refused. -
#1002 by @bobsingor – The document init and import answers say what happened in
status(created,resumedordeduped;imported,dedupedoraccepted), nottag, as every call's answer does. Form fields are taggedkind(wasfamily) and a widget saysfieldKind. The contract test checks that a union is taggedtype,kind,statusorsubtype. -
#992 by @bobsingor – The contract declares
EmbedPDF-Versionas a literal global header, so every generated SDK sends the major and minor of the release it was generated from.
Patch Changes
-
#993 by @bobsingor –
openapi.jsonwrites a field's stored value and a measure out once, asFormValueEntryandPdfMeasurement, instead of once per field family and annotation kind, and each union and enum with a catch-all says what an unknown kind or value reads as. A new test fails when a union with a catch-all has no name in the contract, no row in the SDK checks' list or no fixture case.SHARED_COMPONENT_SCHEMASis exported from@cloudpdf/contract/openapi. -
#990 by @bobsingor – Every response schema reads tolerantly: none refuses a field it doesn't know, and every set it carries is marked closed or names what an unknown value reads as, which a new test checks for each operation. A request naming an
identityis still parsed strictly, and the OpenAPI projection maps that strict twin to the sameIdentitycomponent, soopenapi.jsonis unchanged.
@cloudpdf/engine@3.0.0-next.23
Minor Changes
-
#991 by @bobsingor – Searches pin the manifest's
contentsVersionandlayoutVersion, copied rather than computed, and a write'scontentsVersionis absorbed into the cached manifest. -
#989 by @bobsingor – Cached reads copy each kind's engine value from
/headinto their URLs, with the shape this client reads. An answer that names another engine value (EmbedPDF-Engine) makes the next cached read learn/headagain. -
#994 by @bobsingor – Every server error reads as an
EngineErrorwith the server's code:GrantExpired,OriginNotAllowed,OriginRequired,EngineBusyand the rest of the codes the server sends are the error's code, notForbiddenorUnknown. A code this client doesn't know falls back to the HTTP status. -
#996 by @bobsingor – A grant session's
expiresAtis an ISO 8601 string, and renewal works from it. -
#992 by @bobsingor – Every request to the server says which version the client speaks, in
EmbedPDF-Version. A read through a CDN leaves it out: its answer never depends on it.
Patch Changes
-
#997 by @bobsingor – Reads the renamed engine fields (
displaySha256,contentsSizeBytes,baseSha256, and the editing session'sexpiresInSeconds). -
#995 by @bobsingor –
GrantSessionOptions.visitorStoreis aVisitorStore, left out for none. -
#1005 by @bobsingor – Reads the head's named permission flags; follows engine-core's names.
-
#998 by @bobsingor – A document opened with a token that may not read another client's write, its annotations or its form fields, now hears
fonts.changedwhen that write changed the document's fonts, as one that may read the write does. -
#1003 by @bobsingor – Follows engine-core's names; exported functions take
options. -
#1000 by @bobsingor – Follows engine-core: an event's
originsayssubject,at(ISO 8601),serverSequenceandtransaction; the grant's callbacks areonIdentityRequestedandonOpenRequested, and itsresume()takesvisitorIdentity.
@cloudpdf/sdk@3.0.0-next.23
Minor Changes
-
#991 by @bobsingor – The manifest and cache delta types have
contentsVersion. -
#989 by @bobsingor – The head type has
engine, the server's engine value for each kind of cached read; the manifest type no longer hasserverFonts. -
#994 by @bobsingor – Every error response is one type,
ErrorResponse, with its errorEngineErrorand acodefrom one list, replacingEngineErrorPayload,AdminErrorPayloadand the per-operation error types such asDocHead404Response. A response type is named after its operation alone (DocFormsListResponse, notDocFormsList200Response). Sizes, counts, durations and timestamps are integers, andnextCursor,thumbnailStateandthumbnailUrlare always there. A signature'sfieldMdpandlockareFieldLockSpec, whosepermissionis aDocMdpPermissionthat is never null. A DocMDP level and a page or widget rotation are integers. -
#996 by @bobsingor – Every point in time is an ISO 8601 date-time string, where
createdAt,updatedAt, the other…Atfields and everyexpiresAtwere numbers in milliseconds or seconds. A token revoke takesexpiresAtinstead ofexpiresAtSeconds. A grant'screatedAtandupdatedAt, and a visitor'sfirstSeenAtandlastSeenAt, are no longer typed nullable. -
#997 by @bobsingor – Names follow one rule:
sizeBytes(documents, layers, versions and the init request),baseSha256, a manifest'sbaseSizeBytes,uploadTtlSeconds(also onuploads.create),expiresInSeconds,docIds,md5,displaySha256andsourceSha256,contentsSizeBytes,changedRefs, usage metricspdfViews,pdfUploadsandstorageByteswith module meters in a typedmoduleMetersmap, asubmit-formaction's named flags, a seed value's…Requiredbooleans andparserVersion, and the path argumentsdocId,annotationKey,sha256anddisplaySha256./access, the event stream'ssessionevent and object-number reservations sayexpiresInSeconds. Action trees dropwarningFlags. -
#995 by @bobsingor – A destination's
x,yandzoomare always there,nullto keep the viewer's value, and a document'sopenDestinationis always there. A line'scaptionEnabledis a boolean, nevernull. A grant create takesnullfororiginsandexpiresAt, as a grant read says them. -
#993 by @bobsingor – A field's stored value and a measure are one type each,
FormValueEntryandPdfMeasurement, replacing the per-family and per-kind copies such asFormFieldTextValueEntryandAnnotationLineMeasure. The documentation of each union and enum with a catch-all says what a kind or value the SDK doesn't know reads as. -
#1005 by @bobsingor – A document head's
permissions.flags(PdfPermissionFlags) replacesbits. -
#982 by @bobsingor –
WidgetAnnotationhashasMark:truefor a signature field's widget with a
mark in it (signed, or a mark drawn in), whose style can then no longer change. -
#1002 by @bobsingor –
uploads.create()andupload()resolve{ status, document }(wastag). Form fields are taggedkind, and the init and import answers saystatus. -
#992 by @bobsingor – Every request sends
EmbedPDF-Version, the version the SDK was generated from.
@cloudpdf/server@3.0.0-next.23
Minor Changes
-
#991 by @bobsingor – Layers and base versions store
contents_version(migration 052), raised in the same transaction as a flatten, a redaction or a change to the page set, and published in the manifest. Versioned searches pin it withlayoutVersioninstead of a content epoch, so an annotation write keeps every cached search and a content write refreshes them; the unversioned search form takes the same two pins as optional parameters. -
#989 by @bobsingor –
/headcarries this server's engine value for each kind of cached read: a digest of the rules and fonts it computes that kind with, never of its release, so a deploy that changes nothing keeps every cached answer. Every versioned read checks the token's engine value and shape: a shape newer than the server answers is refused, and another engine value is answered with this server's own answer, uncached, and its value inEmbedPDF-Engine(exposed to browsers), so nothing is cached under a value that doesn't describe it and no request fails during a rolling deploy. Renders are stored by engine value. The manifest no longer carriesserverFonts. -
#994 by @bobsingor – Every error response is
{ error: { code, message, details? } }with a code fromEngineErrorCode. An engine error no longer carriesname. A license refusal isLicenseInvalidwith the license status's code indetails.licenseCode; a usage limit says itsmetricandlimitindetails; a thumbnail that isn't ready says its state indetails.state;BadInputisInvalidArg; and an error from Fastify itself carries the code for its status instead of Fastify's own. -
#996 by @bobsingor – Every point in time the server sends is an ISO 8601 string in UTC, and a grant's and a token revoke's
expiresAtare taken as one, with its offset. Rows keep their milliseconds. The admin routes' records are typed by the contract's, so a field the contract doesn't say no longer compiles. -
#997 by @bobsingor – Takes and sends the renamed fields:
sizeBytes(documents, layers, versions),baseSha256, the manifest'sbaseSizeBytes,uploadTtlSeconds,expiresInSeconds(also the editing session's on/access, the event stream and object-number reservations),docIdsand the camelCase usage metrics (module meters inmoduleMeters), and names its path parametersdocId,annotationKey,sha256anddisplaySha256. -
#992 by @bobsingor – Every response says which version the server is, in
EmbedPDF-Server-Version. A request'sEmbedPDF-Versionis answered within the server's major; another major, or a value that isn't<major>.<minor>, gets a 400 naming both versions. CORS allowsEmbedPDF-Versionand exposesEmbedPDF-Server-Version.
Patch Changes
-
#995 by @bobsingor – A grant create takes
origins: nullandexpiresAt: null, as a grant read says them: any origin and no expiry. -
#1005 by @bobsingor – The head and
/accesscarry named permission flags, not the raw word;/accessno longer sends theadvisory. -
#988 by @bobsingor – Every versioned read (
…@token) now answers exactly the state its pins name. The pins are checked before the read and again after it, and a read that a layer write began during is refused as no longer current, so a write can no longer end up cached for a year under an older version. Before, page renders, page text and geometry, appearance batches, outline, metadata, fonts, attachments, layout, actions, search, signatures and downloads checked their pins only before reading, and the annotation and form reads could still send an applied but uncommitted write. -
#990 by @bobsingor –
redactions.applyparses its body withRedactionApplyScopeInputSchema, which still refuses a field it doesn't know, now that the scope a response carries is read tolerantly. -
#1003 by @bobsingor – Follows engine-core's names:
FormField,Signature. -
#1002 by @bobsingor – The document init and import answers say
status, nottag. Form fields are taggedkind. -
#1000 by @bobsingor – The image encoder and the appearance batch say
mimeType, as engine-core's render results do.
@embedpdf/core-acrojs@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
cssToScriptColor(css)takesstring | null;nullis transparent. -
#1003 by @bobsingor – A script's page move is the effect
{ type: 'goToPage', pageIndex }(wasgotoPagewithpage). -
#1002 by @bobsingor – A script's field input says
kind(wasfamily), as engine-core's form fields do. -
#1000 by @bobsingor –
ScriptUiEffectis taggedtype, as effects are things that happen (waskind). The script host ends withdestroy()and saysdestroyed.
@embedpdf/core-annotation@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
writableTarget(target)takesPdfLinkTarget | null, noundefined. -
#982 by @bobsingor – A signature field's widget with a mark in it is the
widget-markkind, which has no style rows, so a style panel offers nothing that wouldn't show.widgetKindOftakes the widget (itsfieldFamilyandhasMark), anddrawsLiveis exported. -
#1003 by @bobsingor – Geometry names are spelled out:
anchoredGeometry,unanchoredGeometry,effectiveGeometry,obbFromGeometry,isRotatableGeometry. -
#1002 by @bobsingor –
fieldKindOf()replacesfieldFamilyOfKind(), and a widget'sfieldKindreplacesfieldFamily. -
#1000 by @bobsingor – The snap settings name their units:
alignmentThresholdPxandrotationThresholdDeg.
Patch Changes
-
#995 by @bobsingor – The editor's rich text predicts the engine's rule: a body it gives is replaced whole over the defaults, and without one the annotation's body is kept.
-
#985 by @bobsingor – The rich text model's plain projection joins paragraphs with
\n, and a hard line break inside a run is\n, matching the rich text the engine returns.
@embedpdf/core-form@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
widgetScene(drawing, placement)takes aWidgetScenePlacement(wasWidgetPlacement, the engine's name for a widget draft's placement). -
#982 by @bobsingor – The painter draws a signature field's widget: its box, the background and border as a text field draws them, exactly as the engine writes it.
Patch Changes
-
#1003 by @bobsingor – Follows engine-core: form fields are
FormField. -
#1002 by @bobsingor – Follows engine-core: form fields are tagged
kind.
@embedpdf/core-geometry@3.0.0-next.23
Minor Changes
- #1003 by @bobsingor –
RotationreplacesPageRotation, besideRect,PointandSize.
@embedpdf/core-js-sandbox@3.0.0-next.23
Minor Changes
- #1000 by @bobsingor – The QuickJS sandbox ends with
destroy()and saysdestroyed, as every other object does.
@embedpdf/core@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – A settings declaration's
wholenames a setting inside a group by its path ('snapshot.box'), and a whole setting's change takes its defaults for what it leaves out, never the value before.mergeSettings(settings, changes, declaration?)takes the declaration (defaultsandwhole) instead of thewholelist.MirrorSpec.load()answerscursor?: number, nonull. -
#1003 by @bobsingor –
PluginDefinition<State, Capability, PluginSettings>replacesPluginDef<S, C, T>, and the generics ofPluginContext<State, PluginSettings>andStateCell<State>are named. -
#1000 by @bobsingor –
destroy()is the one verb that ends an object's life, neverdispose(): prepared and staged prints,Scope(withdestroyed), event hook sources, the settings store and the test kernel.acquire(get, release)names its second argument for what it does.Kernel.getStatus()replacesstatus(). A document's page-list counter ispagesSequence(onDocumentMetaandDocumentPagesChangedEvent), notrevision, which in a PDF means a saved file revision.PendingPageis taggedkind. Settings events carrychangedKeys, as metadata's do. Mirror specs takeonChanged. A document's grant question isopenRequest, as the engine names it, andretry()takesvisitorIdentity.changes.listPending()and the page view'sgetPending(page)start with a verb.
@embedpdf/core-signature@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
validateChain(cms, trust, at?)takestrust: TrustPort | null, noundefined. -
#1000 by @bobsingor –
SignatureVerdict.validationTimereplacesvalidatedAt, which wasn't a time, andvalidateSignatures()takesvalidationTime(wasat). Times are ISO 8601 strings:ParsedCms.signingTime,BuildDetachedCmsInput.signingTimeand a timestampValidationTime'sgenTime.
Patch Changes
-
#997 by @bobsingor – Reads a signature's
contentsSizeBytes. -
#1003 by @bobsingor – Follows engine-core: a signature is
Signature.
@embedpdf/core-stage@3.0.0-next.23
Minor Changes
- #1003 by @bobsingor –
PageGeometryreplacesPageGeom, and anAnchorsaysfractionXandfractionY(werefxandfy).
@embedpdf/core-text@3.0.0-next.23
Minor Changes
- #999 by @bobsingor –
defaultPaintFonts(fontFamily)takesstring | null, noundefined.
@embedpdf/core-ui@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
resolveLayout(option, defaults, env)takesoption: LayoutOption | undefined, nonull. -
#1003 by @bobsingor –
CustomSlotContextreplacesCustomSlotCtx. -
#1000 by @bobsingor –
OverflowRowis taggedkind, as things that are are.
@embedpdf/engine-core@3.0.0-next.23
Minor Changes
-
#991 by @bobsingor – The manifest has
contentsVersion, the document-wide pin of every page's content: it moves with any write that moves a page'scontentVersion, inserts a page or deletes one, and a write'scacheDeltacarries it when it moved. A search token pinscontentsVersionandlayoutVersioninstead ofepoch, andsearchContentEpochis gone. -
#989 by @bobsingor – Every cached read's token carries its kind's engine value and the shape the client reads (
engine,shape): the encoders take aTokenPinand the decoders return one aspin.CACHED_READ_KINDS,SHAPES,tokenPinOf,EngineValuesandTokenPinare exported from the wire entry.DocumentHeadgainsengine, this server's engine value for each kind.DocumentManifestno longer carriesserverFonts, and render and appearance tokens carry the engine value in its place. The layout and search tokens dropformat(LAYOUT_FORMATandSEARCH_RESULT_FORMATare gone): their shape isshape.PAGE_TEXT_VERSIONandLINE_BREAKS_VERSIONversion the rules page text and returned text are read by. -
#994 by @bobsingor – One error body for every HTTP error,
ErrorResponseSchema({ error: { code, message, details? } }), andEngineErrorSchemafor the error inside it, replacingEngineErrorPayloadSchema. A serializedEngineErrorno longer carriesname.EngineErrorCodeis the one code list: it gains the codes the server sends (Conflict,EngineBusy,EngineRestarting,DocumentQuarantined,ThumbnailNotReady,TooManyRequests,GrantExpired,OriginRequired,OriginNotAllowed,FeatureNotEnabled,FeatureStopped,LicenseInvalid,LicenseUsageLimit,UpstreamError), andisEngineErrorCodetells whether a value is one.SignatureWireComponentsnamesDocMdpPermissionandFieldLockSpecfor the OpenAPI document. -
#996 by @bobsingor – Every point in time on the wire is an ISO 8601 string: an access's
expiresAtand its CDN'scdn.expiresAt(DocumentAccessInfo,CdnAccessInfo,AccessResponseSchema), a layer version'screatedAt, and a prepared signature'sexpiresAt(now typedIsoDateTimeSchema). They were Unix seconds, and a layer version's milliseconds. -
#997 by @bobsingor – Names, units and flags follow one rule (naming.md, "The HTTP API"):
- Flags are named booleans. A
submit-formaction reads and writesexclude,includeNoValueFields,format,methodand the rest flat on its payload or action, without aflagsobject or a raw word;encodeSubmitFormFlagsis the inverse ofdecodeSubmitFormFlags. An action tree dropswarningFlags(itswarningsname them). A seed value saysfilterRequired,subFiltersRequired,parserVersionRequired,digestMethodsRequiredandreasonsRequiredinstead ofrequiredFlagsandpresentFlags, and itsversionisparserVersion. A form submission's intent dropsflagsRaw. - One name, one meaning. Mutation results list what they touched in
changedRefs(waschanged). - Units and algorithms in names. An attachment's
sizeandchecksumaresizeBytesandmd5; a font program'sdisplayHashandsourceHasharedisplaySha256andsourceSha256; a version'sbyteLengthissizeBytes; a signature'scontentsSize(andprepare's) iscontentsSizeBytes; the head, the manifest and the version list saybaseSha256, the headsizeBytesand the manifestbaseSizeBytes(wasbaseByteLength); an editing session'sexpiresIn(EditSessionAccess,EditSessionStatus, an object-number reservation) isexpiresInSeconds. - Path parameters are spelled out in
wireTemplates::annotationKey,:sha256and:displaySha256. Thedocument.fonts.programworker request names its program bydisplaySha256, andsignatures.finalizeCandidatetakescontentsSizeBytes.
- Flags are named booleans. A
-
#995 by @bobsingor – One spelling for "nothing" (naming.md, "Nothing: left out or
null"):- A destination always has its axes:
PageDestination'sx,yandzoom(andPdfDestination'sleft,topandzoom) are always there,nullto keep the viewer's value, never left out. DocumentActionsSnapshot.openDestinationis always there,nullwhen the document has none.CommentThreadReview.mineis always there:nullwhen the reviewer has none, or when nocurrentUserIdwas given.- An annotation create's
groupId: nullis no group, refused to a caller who has one; left out is still the caller's own group. It used to put the annotation in the caller's group. - A free text's new rich text replaces the body whole when it gives one (what it leaves out takes the default, as on a comment), and keeps the current body when it doesn't. A partial body used to merge over the current one.
- An annotation create left without
nmstill gets a fresh name;nm: nullnow writes none, as a file from a tool that names nothing reads. It used to mint one too. A copy leavesnmout. - A widget's
fontFamily,fontSizeandfontColortake values only: a font can't be removed, sonullis only the read sent back (no font on the widget or the form), and is refused beside a font. It used to write Helvetica 12 black. - A line's
captionEnabledreadsfalsewithout/Cap, the PDF's default, and takes nonull. A polygon's and polyline's keepnullfor no caption and no placement. OpenOptions.passwordisstring, left out for none.LineCaptionPatchandShapeCaptionPatch, unused, are gone.
- A destination always has its axes:
-
#993 by @bobsingor – Every union a response carries with a catch-all kind is a named contract model: a field's stored value (
FormValueEntry) and a measure (PdfMeasurement) joinAnnotation,FormField,PdfLinkTargetandPdfActionNodein the wire components. Each of the six, a widget'sfieldFamilyand an error'scodenow describe what a client reads a kind or value it doesn't know as.openUnionOf()andopenUnionsIn()in@embedpdf/engine-core/conformancefind the unions with a catch-all in a schema. -
#985 by @bobsingor – Page text ends its lines in
\nand leaves out the characters a reader can't see as text. A line break PDFium extracts as\r\ngives\n: its\rkeeps its place in character space and gives no text. A Unicode noncharacter gives no text either, so a word PDFium joined across a line-end hyphen (which it marks with U+FFFE) reads, copies and searches whole:Verita-andserumreadVeritaserum. Character positions don't change, so selections, highlights and search hits are where they were. New exports:toPageText(the projection),isNoncharacterandtoLineBreaks.Search ignores invisible characters, so a match runs across a soft hyphen, a zero-width space or joiner, a bidi mark, U+FEFF, a control code other than whitespace, or a noncharacter.
SEARCH_FOLD_VERSIONis now 2.Every other string the engine returns ends its lines in
\ntoo: an annotation'scontents(its rich text's plain projection joins paragraphs with\n) and a hard line break inside a rich text run, whichRichTextRun.textnow spells\n. -
#1005 by @bobsingor – A PDF's permissions are named flags,
PdfPermissionFlags:print,modifyContents,copy,modifyAnnotations,fillForms,copyForAccessibility,assembleandprintHighQuality(pdf.js's names), replacingPdfBitsand itsbit3…bit12. A document head's and security state'spermissions.flagsreplaces the rawbitsword, andPdfPermissionInfocarriesflagswith nobits. Theadvisory(canPrint, …) andadvisoryFromPdfBits()are gone:materializePdfPermissions(flags)says whatpdf.permissionsgrants.permissionFlagsOf(word)replacesdecodePdfBits(), and the permission checks takepermissionFlags. -
#982 by @bobsingor – A widget reads
hasMark:truewhen it is a signature field's widget with a mark in it, because the field is signed or a mark was drawn in withforms.setSignatureAppearance. A new signature field's widget is predicted with its appearance (its box), andWIDGET_STYLE_NAMESlists the fields that make up a widget's style. -
#990 by @bobsingor – Responses are read tolerantly, as
docs/conventions/api-evolution.mdasks, so a client keeps working against a newer server. No schema a response is parsed with refuses a field it doesn't know any more, nested ones included (LineLeaderSchema, a measure'sorigin,IdentitySchema,RedactionApplyScopeSchema,BundleLimitsSchema,ImageResourceKeysSchema); requests are still parsed strictly, withLineLeaderWriteSchema,IdentityInputSchemaandRedactionApplyScopeInputSchema.An annotation of a subtype the client doesn't know reads as
unsupportedinstead of failing the whole list, keeping the fields every annotation has, withrawSubtypeCodeandrawSubtypeNamefrom the body when it carries them and0andnullwhen it doesn't. A subtype the client knows with a malformed body still fails. The other sets with a catch-all read the same way: an errorcodeasUnknown, a widget'sfieldFamilyand a form field'sfamilyasunknown, a measure asunknown, a link or outline target asunsupported, an action asunknownand a field's value entry asunsupported.Every other enum, literal and union a response carries is marked closed with the new
closed(), next toreadsUnknownAs()andwithCatchAll()for open ones, andreadingProblems()andwithUnknownFields()in@embedpdf/engine-core/conformancecheck a schema against the convention. -
#1003 by @bobsingor –
FormField(withTextField,CheckboxField,RadioField,ComboBoxField,ListBoxField,PushButtonField,SignatureFieldandUnknownField) andSignaturereplace the…DTOnames. The deprecatedPoint,Rect,SizeandRotationaliases andPointSchema/RectSchemaare gone: use thePdf…names. Exported functions takeoptions, neveropts. -
#1002 by @bobsingor – A form field is tagged
kind, notfamily, as naming.md tags things that are:field.kind === 'checkbox', the typeFormFieldKind, a draft's and a patch'skind, and a widget annotation'sfieldKind. A values import's diagnostics sayunsupported-kindandwrong-kind. -
#992 by @bobsingor –
API_VERSIONis the version this release speaks, the major and minor of its package version, withparseApiVersionandapiVersionOfto read one. -
#1000 by @bobsingor – An event's
originspells out its fields:subject(wassub),atas an ISO 8601 string (wasts, milliseconds),serverSequence(wasserverId) andtransaction(wastx);stream.desyncedcarriesat, and the event stream'slastServerSequence()replaceslastServerId(). A grant's callbacks areonIdentityRequestedandonOpenRequested, andresume()takesvisitorIdentity. Render results and appearance pictures saymimeType, as attachments and stamps do (wascontentType).
Patch Changes
- #999 by @bobsingor – A widget's
dashArraydoc says what the code does: left out on a dashed border is the default pattern, andnullis no pattern.
@embedpdf/engine-services@3.0.0-next.23
Minor Changes
-
#982 by @bobsingor – A signature field draws its box: placing one writes its background and border, and a restyle draws them again, as it does for a widget in no field. Once a mark is in the field (it is signed, or a mark was drawn in), the mark stays: a resize keeps it, and a style change is refused with
InvalidArg. A mark drawn in records how it fits the widget, as a stamp records its own. -
#1000 by @bobsingor – A worker image encoder's result says
mimeType(wascontentType), as render results do.
Patch Changes
-
#997 by @bobsingor – Reads and writes a
submit-formaction's flags by name, and says the renamed fields (sizeBytes,md5,displaySha256,contentsSizeBytes,changedRefs, the seed value's booleans). -
#995 by @bobsingor – A stamping import still puts an item in no group in the caller's group, now that an annotation create's
groupId: nullasks for no group, and still gives each copy a fresh name, now thatnm: nullasks for none. -
#985 by @bobsingor – Page text comes from
toPageText: lines end in\n, and noncharacters such as the U+FFFE PDFium writes for a joined line-end hyphen give no text. An annotation's/Contentsreads with\nline breaks and is written with\r, as Acrobat writes it. Hard line breaks in rich text runs read as\nand are written as\r. -
#1003 by @bobsingor – Follows engine-core's names.
-
#1002 by @bobsingor – Follows engine-core: form fields are tagged
kind.
@embedpdf/angular@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The viewer takes
nullforidentityandscope, as its settings read them:identity: nullis nobody, andscope: nulllets the user do everything. -
#1003 by @bobsingor – Follows the plugins:
CommandDefinition,FormField,selectionHandleGeometry,CustomSlotContext, and an actions adapter'sgoToPage(pageIndex). -
#1000 by @bobsingor – Follows the plugins:
EpdfAttachmenthascreate,delete,canCreateandcanDelete;EpdfViewManagerhasdeletePaneandpaneDeleted$;EpdfLink.readAllLinks,EpdfStamp.getAssetBytes,EpdfFonts.readProgram,EpdfActions.readActionTree; a command'sshortcutLabel.
@embedpdf/react@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The viewer takes
nullforidentityandscope, as its settings read them:identity: nullis nobody, andscope: nulllets the user do everything. -
#1003 by @bobsingor – Follows the plugins:
CommandDefinition,FormField,selectionHandleGeometry,CustomSlotContext, and an actions adapter'sgoToPage(pageIndex).
Patch Changes
- #1000 by @bobsingor – Follows the plugins: the attachment state's
canCreate,OverflowRow.kind,destroy().
@embedpdf/svelte@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The viewer takes
nullforidentityandscope, as its settings read them:identity: nullis nobody, andscope: nulllets the user do everything. -
#1003 by @bobsingor – Follows the plugins:
CommandDefinition,FormField,selectionHandleGeometry,CustomSlotContext, and an actions adapter'sgoToPage(pageIndex).
Patch Changes
- #1000 by @bobsingor – Follows the plugins: the attachment state's
canCreate,OverflowRow.kind,destroy().
@embedpdf/vue@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The viewer takes
nullforidentityandscope, as its settings read them:identity: nullis nobody, andscope: nulllets the user do everything. -
#1003 by @bobsingor – Follows the plugins:
CommandDefinition,FormField,selectionHandleGeometry,CustomSlotContext, and an actions adapter'sgoToPage(pageIndex).
Patch Changes
- #1000 by @bobsingor – Follows the plugins: the attachment state's
canCreate,OverflowRow.kind,destroy().
@embedpdf/web@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor – An actions adapter's page move is
goToPage(pageIndex, context). Follows core-geometry:Rotation. -
#1000 by @bobsingor – The printer ends with
destroy(). A page projector's stage is read throughgetPageBox(), and a link anchor dispatches{ type: 'annotation', annotation }, as the actions plugin's triggers are.
Patch Changes
- #985 by @bobsingor – The rich text editor reads a hard line break, however the browser spells it, as
\n, and its offsets count paragraphs joined by\n, matching the rich text the engine returns.
@embedpdf/plugin-actions@3.0.0-next.23
Minor Changes
-
#997 by @bobsingor –
SubmitIntentandActionSubmitRequestdropflagsRaw: an intent'sformat,methodand resolved fields already say what the flags meant. -
#1003 by @bobsingor – The UI adapter's page move is
goToPage(pageIndex, context)(wasgotoPage(page, …)). The host contract'sAnnotationCommitEntry,AnnotationCommitResultandAnnotationCommitSinkare spelled out. Read shapes arereadonly. -
#1000 by @bobsingor –
readActionTree()replacesgetActionTree(): a read from the engine isread*.ActionTriggerandActionTriggerEventare taggedtype(wasscope); a trigger's annotation isannotation(wasref) and an event's name isevent(wasname), asActionTreeSourcesays. The host contract's realm ends withdestroy().
@embedpdf/plugin-annotation@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
chrome.marqueeis one look: a change replaces it whole, and a color it leaves out follows the accent again. The otherchromegroups still merge per key. -
#1003 by @bobsingor – The sub-capabilities are
AnnotationSelectionCapability,AnnotationDraftCapability,AnnotationTextCapability,AnnotationToolsCapability,AnnotationStampsCapability,AnnotationLinksCapabilityandCommentsCapability(were…Api).AnnotationToolDefinitionreplacesAnnotationToolDef. Read shapes arereadonly. -
#1000 by @bobsingor – The selection is
selection.select(refs)andselection.getSelected(), as page-edit, attachment and outline have them (wassetandlist).CommentThreadChangedEventis taggedtype(waschange). The host contract's functions start with a verb:getAuthority,getPictureEpoch,getPictureVersion,isPending,getDistanceCreationPage. The snap settings arealignmentThresholdPxandrotationThresholdDeg.
Patch Changes
- #982 by @bobsingor – A lent record with no live drawing keeps its picture while a new look is pending, instead of drawing its bare style in its place.
@embedpdf/plugin-attachment@3.0.0-next.23
Minor Changes
- #1000 by @bobsingor – Attachments are created and deleted, as the engine's
attachments.create/deletesay:create(),delete(),canCreate(),canDelete()and the state'scanCreate(wereadd,remove,canAdd,canRemove).onChangedsays'created'and'deleted'.
Patch Changes
- #997 by @bobsingor – Reads a file's
sizeBytesandmd5.
@embedpdf/plugin-commands@3.0.0-next.23
Minor Changes
-
#1006 by @bobsingor – A command can have
labelParams(context): the values for its label's{name}slots, such as how many pages are selected. It's asked likeenabled, again whenever the viewer's state or your app's changes. The values go intolabel, into the translated words underlabelKeyor the command's id, where a numbercountpicks the plural form, and into every sentence that names the label. AlabelParamsthat throws gives no values. Without the i18n plugin,label's slots are filled too. -
#1003 by @bobsingor –
CommandDefinitionreplacesCommandDef. -
#1000 by @bobsingor – A bound command's formatted shortcut is
shortcutLabel;shortcutstays the key a command definition takes.
@embedpdf/plugin-fonts@3.0.0-next.23
Minor Changes
- #1000 by @bobsingor –
readProgram()replacesgetProgram(): a read from the engine isread*.
Patch Changes
- #997 by @bobsingor – Reads a program's
displaySha256andsourceSha256.
@embedpdf/plugin-form@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor –
FormToolDefinitionreplacesFormToolDef, and form fields areFormField. Read shapes arereadonly. -
#1002 by @bobsingor – Form fields are tagged
kind:list({ kind }), thefillablesetting's field kinds (FormFieldKind), a form tool'sfieldKindandAuthorableFormKind. -
#1000 by @bobsingor –
WidgetActivationResultis taggedstatus, as every call result is (waskind).FormUiEffectis taggedtype. The scripting realm ends withdestroy().
Patch Changes
-
#997 by @bobsingor – A scripted submit no longer sends
flagsRaw. -
#982 by @bobsingor – In design mode a restyled signature field shows its new look at once and keeps it, instead of flashing it and going back. A signature field with a mark in it is drawn only by its picture.
@embedpdf/plugin-i18n@3.0.0-next.23
Minor Changes
-
#1004 by @bobsingor – A fallback language in
loadersnow loads at the start, and a language shows once it and the fallback language are in, so a lazy fallback language no longer shows keys in place of its strings. Until then the fallback language shows, or, while that loads too, the first language inlocales. A language in bothlocalesandloadersshows itslocalesstrings until its loader has run, and the loader's language then replaces them. When the fallback language can't load,onLocaleLoadFailedfires and languages show without it. -
#1006 by @bobsingor –
interpolate(text, params)fills a string's{name}slots ast()does, for text that has no translation.TranslateOptions.paramstakes a readonly record.
Patch Changes
- #1000 by @bobsingor – Follows core's settings events (
changedKeys).
@embedpdf/plugin-interaction@3.0.0-next.23
Minor Changes
- #1000 by @bobsingor – An
InteractionHandlersaysonPointerDown,onPointerMove,onPointerUpandonPointerCancel, as aTooldoes (wasonDown,onMove,onUp,onCancel).
Patch Changes
- #1003 by @bobsingor – Follows core-geometry:
Rotation.
@embedpdf/plugin-link@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor – Read shapes are
readonly. -
#1000 by @bobsingor –
readAllLinks()replaceslistAllLinks(): a read from the engine isread*.LinkActivationis taggedstatus, as every call result is (wasoutcome).
@embedpdf/plugin-measurement@3.0.0-next.23
Minor Changes
- #1003 by @bobsingor – Read shapes are
readonly.
Patch Changes
- #1000 by @bobsingor – Follows core's settings events (
changedKeys) and mirror specs (onChanged).
@embedpdf/plugin-render@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The
formatandqualitysettings readnullwhile the engine chooses, soupdateSettings({ format: null })gives the choice back; they used to readundefined, which a change could never set.snapshot.boxis one look: a change replaces it whole, and a color it leaves out follows the accent again. -
#1003 by @bobsingor – The full-page and tile settings types are
FullPageSettingsandTilesSettings(were…Options). -
#1000 by @bobsingor – The tile settings name their units:
bleedPxandengageRatio(werebleedandengageAt). Results saymimeType. The host contract's view demand ends withdestroy(), andgetKeptAppearances()starts with a verb.
@embedpdf/plugin-search@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor –
highlight.blendModeis engine-core'sBlendMode; theSearchBlendModecopy is gone. -
#1000 by @bobsingor –
refresh()resolves nothing, as every plugin's does; the result is in the state and the events.
Patch Changes
- #983 by @bobsingor – A search asks for snippets only when the session may copy text (
doc.text.copy). Before, it always asked for them first and, when refused, searched again without them: two requests for every search in a session without copy rights.findAll(query, { snippets: true })now refuses withpermission-denied(namingdoc.text.copy) without asking the engine. If the engine still refuses snippets the session looked allowed to have, the search falls back to matches without them as before.
@embedpdf/plugin-selection@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor –
SelectionHandleGeometryandselectionHandleGeometry()replace the…Geomnames. Read shapes arereadonly. -
#1000 by @bobsingor – The drag setting names its unit:
dragThresholdPx.
@embedpdf/plugin-signature@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor –
getSignature()returnsSignatureInfo, aslistSignatures()does: the field's facts and itsverdict(nulluntil checked, or for an unsigned field). ThePreparedSignaturealias is gone:prepareSignature()resolvesSignaturePrepared. -
#1000 by @bobsingor –
refresh()resolves nothing, as every plugin's does. The signing key issigningKey(setting andsign()option) and its typeSigningKey(werekeyandSignatureKey: in naming.md a key is a lookup key).PlaceMarkResultis taggedstatus, as every call result is (waskind).validate()takesvalidationTime(wasat).
Patch Changes
- #1002 by @bobsingor – Follows engine-core: form fields are tagged
kind.
@embedpdf/plugin-stage@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor –
reveal()'srectisrect?: Rect: left out is the whole page, andnullis no longer taken. AzoomBoxchange that gives a color asundefinedfollows the accent, instead of storingundefined. -
#1003 by @bobsingor – Read shapes are
readonly, the settings included. Follows core-geometry and core-stage:Rotation,PageGeometry. -
#1000 by @bobsingor –
StageViewState.pageIndexreplacescursor.getPageBox()replacesgetPageFrame(), sincePageFrameis a setting. A reveal's alignment isalign?: RevealAlignment, its valuesArrivalAlignValue(wereanchor,RevealAnchorandRevealAnchorValue, a copy of it). Settings events carrychangedKeys.
@embedpdf/plugin-stamp@3.0.0-next.23
Minor Changes
-
#1003 by @bobsingor –
createAsset()takesCreateAssetInput(wasAddAssetInput). Read shapes arereadonly. -
#1000 by @bobsingor –
getAssetBytes()replacesreadAssetBytes(): it's synchronous.StampLibraryChangedEventis taggedtype(wasreason) and says'asset-created','asset-deleted'and'deleted', asonAssetCreated,onAssetDeletedandonLibraryDeleteddo.ImportLibraryOptions.assetKindreplaceskind, whichCreateLibraryOptionsuses for the library's.
@embedpdf/plugin-view-manager@3.0.0-next.23
Minor Changes
- #1000 by @bobsingor –
deletePane(),DeletePaneOptions,onPaneDeletedandPaneDeletedEventpair withcreatePane()(wereremovePane,RemovePaneOptions,onPaneRemovedandPaneRemovedEvent).
@embedpdf/viewer-chrome@3.0.0-next.23
Minor Changes
-
#999 by @bobsingor – The viewer takes
nullforidentityandscope, as its settings read them:identity: nullis nobody, andscope: nulllets the user do everything. -
#1003 by @bobsingor – A viewer command is a
CommandDefinition(wasCommandDef). -
#1006 by @bobsingor – A command of yours can have
labelParams, which gets the same context asenabled: plugins by name throughget, yourappState, the document and the viewer. Its values fill the{name}slots in the command's label, and a numbercountpicks the plural form of translated words. -
#1004 by @bobsingor –
stringstakes a language's words as a function that loads them the first time the language shows, andplugins.i18n.fallbackLocalesets the fallback language, also shown when the browser asks for none of the viewer's languages.plugins.i18ntakes onlyfallbackLocale.document:downloadsaves the document under its name. -
#1000 by @bobsingor –
ViewerLifetime.destroy()replacesdispose(). The signature setting's key issigningKey. -
#1011 by @bobsingor – Selected redaction marks can be applied from the
annotationbar: its newannotation:apply-redactioncommand shows when every selected annotation is a redaction mark, and asks first in the same confirmation asredaction:apply, counting only those marks and the other annotations under them. The confirmation's title takes plural forms instringsnow (demo.redactConfirmTitle), and the command's label iscommands.redact.apply, such as{ one: 'Apply Redaction', other: 'Apply {count} Redactions' }.
Patch Changes
-
#1009 by @bobsingor – A comment without an author shows as "Guest" instead of "Unknown", in every language, as it did in v2.
-
#997 by @bobsingor – The attachments panel reads a file's
sizeBytes. -
#1001 by @bobsingor – On a phone, a submenu opened in a menu's sheet covers the menu under it completely. Before, once it finished sliding in, the rows of the menu under it that open submenus showed through its top rows.
-
#1002 by @bobsingor – Follows engine-core: form fields are tagged
kind. -
#1007 by @bobsingor – Counts read right in every language: the number of files and comments, search results, redaction marks and selected annotations each pick their language's plural form, such as Polish's
fewandmanyand Arabic's six forms, instead of choosing between a singular and a plural word or a "Label: 3" wording.attachments.countPluralandcomments.countPluralare gone:attachments.count,comments.count,demo.searchResults,demo.redactConfirmBody,demo.redactConfirmCollateralandstylePanel.selectedtake plural forms instrings, such as{ one: '{count} file', other: '{count} files' }.
@embedpdf/viewer@3.0.0-next.23
Minor Changes
- #1004 by @bobsingor –
stringstakes a language's words as a function too, such assv: () => import('./sv.json'): they load the first time the viewer shows that language, which shows once they're in.plugins.i18n.fallbackLocalesets the fallback language, one of the viewer's or one of yours: the language a browser gets when the viewer has none of its languages, and where every word the current language doesn't have comes from. It loads at the start.plugins.i18ntakes onlyfallbackLocalenow; the languages arelocaleandstrings, and other keys are left out with a warning. The viewer's English words ship as@embedpdf/viewer/strings/en.json, to start a translation from. A download is saved under the document's name instead ofdocument.pdf.
Patch Changes
-
#1003 by @bobsingor – Follows the viewer chrome:
CommandDefinition. -
#1000 by @bobsingor – Follows the viewer chrome: the signature setting's key is
signingKey.
@cloudpdf/server-modules@3.0.0-next.23
Patch Changes
-
#997 by @bobsingor – The test server seeds its documents with the init request's
sizeBytes. -
#1002 by @bobsingor – The test server reads the init answer's
status.
@embedpdf/core-fonts@3.0.0-next.23
Patch Changes
- #997 by @bobsingor – A built-in program's facts say
displaySha256.
@embedpdf/engine@3.0.0-next.23
Patch Changes
-
#997 by @bobsingor – Asks the worker for a font program by its
displaySha256. -
#1005 by @bobsingor – Follows engine-core: permissions are named flags.
-
#1003 by @bobsingor – Follows engine-core's names.
createLocalEngine(options)and the other factories takeoptions. -
#1000 by @bobsingor – Follows engine-core: encoded pictures say
mimeType.
@embedpdf/plugin-history@3.0.0-next.23
Patch Changes
- #1000 by @bobsingor – Follows core's
changes.listPending().
@embedpdf/plugin-metadata@3.0.0-next.23
Patch Changes
- #1000 by @bobsingor – Follows core's mirror specs (
onChanged).
@embedpdf/plugin-outline@3.0.0-next.23
Patch Changes
-
#997 by @bobsingor – Reads a mutation's
changedRefs. -
#1000 by @bobsingor – Activating an item resolves a
LinkActivationtaggedstatus. Follows core's mirror specs (onChanged) andpagesSequence.
@embedpdf/plugin-redaction@3.0.0-next.23
Patch Changes
- #1000 by @bobsingor – Follows core's settings events (
changedKeys).
@embedpdf/viewer-react@3.0.0-next.23
Patch Changes
- #1003 by @bobsingor – Follows the plugins' names.