@growth-labs/cms 0.5.15 → 0.5.17
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/engine/d1.d.ts +21 -0
- package/dist/engine/d1.d.ts.map +1 -1
- package/dist/engine/index.d.ts +2 -1
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +1 -0
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/published-content.d.ts +10 -0
- package/dist/engine/published-content.d.ts.map +1 -1
- package/dist/engine/published-content.js +68 -17
- package/dist/engine/published-content.js.map +1 -1
- package/dist/engine/read-session.d.ts +24 -0
- package/dist/engine/read-session.d.ts.map +1 -0
- package/dist/engine/read-session.js +43 -0
- package/dist/engine/read-session.js.map +1 -0
- package/package.json +1 -1
- package/src/engine/d1.ts +22 -0
- package/src/engine/index.ts +2 -1
- package/src/engine/published-content.ts +99 -26
- package/src/engine/read-session.ts +43 -0
package/dist/engine/d1.d.ts
CHANGED
|
@@ -12,5 +12,26 @@ export interface D1PreparedStatement {
|
|
|
12
12
|
export interface D1Database {
|
|
13
13
|
prepare(query: string): D1PreparedStatement;
|
|
14
14
|
batch(statements: D1PreparedStatement[]): Promise<D1Result[]>;
|
|
15
|
+
/**
|
|
16
|
+
* The D1 Sessions API entry point (present on real workerd bindings; absent
|
|
17
|
+
* on some local shims). A session routes reads to the nearest read replica
|
|
18
|
+
* with sequential consistency inside the session; writes still reach the
|
|
19
|
+
* primary. Optional so structural fakes without it remain assignable —
|
|
20
|
+
* callers must feature-check (see `openReadSession`).
|
|
21
|
+
*/
|
|
22
|
+
withSession?(constraint?: string): D1DatabaseSession;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The session handle returned by `withSession`. Structurally the same
|
|
26
|
+
* prepare/batch surface the engine reads through — it deliberately omits
|
|
27
|
+
* `withSession` itself (sessions do not nest). `getBookmark` returns the
|
|
28
|
+
* session's latest observed commit token (null until the first query
|
|
29
|
+
* completes) — D1's mechanism for carrying consistency across sessions,
|
|
30
|
+
* requests, or a write on the raw binding followed by a session read.
|
|
31
|
+
*/
|
|
32
|
+
export interface D1DatabaseSession {
|
|
33
|
+
prepare(query: string): D1PreparedStatement;
|
|
34
|
+
batch(statements: D1PreparedStatement[]): Promise<D1Result[]>;
|
|
35
|
+
getBookmark?(): string | null;
|
|
15
36
|
}
|
|
16
37
|
//# sourceMappingURL=d1.d.ts.map
|
package/dist/engine/d1.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../src/engine/d1.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACvE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;CACxD;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC3C,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../src/engine/d1.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,QAAQ,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpD,OAAO,CAAC,EAAE,CAAC,EAAE,CAAA;IACb,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,MAAM,WAAW,mBAAmB;IACnC,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;IACvE,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;CACxD;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC3C,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7D;;;;;;OAMG;IACH,WAAW,CAAC,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAAA;CACpD;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IACjC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,CAAA;IAC3C,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC7D,WAAW,CAAC,IAAI,MAAM,GAAG,IAAI,CAAA;CAC7B"}
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { type ApiKeyListEntry, type CreateApiKeyInput, type CreateApiKeyResult,
|
|
|
7
7
|
export { type ContentMetadata, ContentMetadataError, type ContentMetadataPrimitive, type ContentMetadataValue, MAX_CONTENT_METADATA_BYTES, parseContentMetadata, serializeContentMetadata, } from './content-metadata.js';
|
|
8
8
|
export { type ContributorInput, type ContributorRecord, listContributors, setContributors, } from './contributors.js';
|
|
9
9
|
export { runScheduledPublish, type ScheduledPublishResult } from './cron.js';
|
|
10
|
-
export type { D1Database, D1PreparedStatement, D1Result } from './d1.js';
|
|
10
|
+
export type { D1Database, D1DatabaseSession, D1PreparedStatement, D1Result } from './d1.js';
|
|
11
11
|
export { applyFoundryCallback, type CallbackInput, type DispatchResult, dispatchToFoundry, type ProcessingState, verifyHmac, } from './foundry-dispatch.js';
|
|
12
12
|
export { htmlToMarkdown, type ParsedImportItem, parseGhost, parseMarkdown, parseSubstackCsv, } from './import-parsers.js';
|
|
13
13
|
export { type AcceptInviteInput, acceptInvite, type CreateInviteInput, type CreateInviteResult, createInvite, hashInviteToken, type InviteRecord, loadInviteByToken, } from './invites.js';
|
|
@@ -18,6 +18,7 @@ export { ContentArchiveImportLimitError, type ContentArchiveInput, type ContentA
|
|
|
18
18
|
export { evaluateArticleBody, type PublishGuardOptions, type PublishGuardOutcome, publishGuardResponseOrNull, } from './publish-guard.js';
|
|
19
19
|
export { getPublishedContentById, getPublishedContentBySlug, type ListPublishedContentOptions, listPublishedContent, MAX_PUBLISHED_CONTENT_PAGE_BYTES, MAX_PUBLISHED_CONTENT_PAGE_SIZE, MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES, type PublishedContent, type PublishedContentCursor, type PublishedContentPage, PublishedContentReadError, type PublishedContentReadErrorCode, } from './published-content.js';
|
|
20
20
|
export { type ArticleInput, assertContentBodyValidForPublish, type BaseContentInput, type ContentItemRecord, type CreateContentInput, claimScheduledForPublish, countWords, createContent, createRevision, duplicateContentItem, ensureUniqueSlug, estimateReadTime, evaluateContentBodyForPublish, getContentItem, getContentRelations, getContentSnapshot, getContentTagPairs, MAX_ITEM_TAG_COUNT, MAX_ITEM_TAGS_TOTAL_BYTES, MAX_TAG_LABEL_BYTES, type NewsletterInput, type PodcastInput, PublishContentValidationError, publishContent, scheduleContent, setContentRelations, setContentTags, TagInputError, type UpdateContentInput, unpublishContent, updateContentItem, VerifiedMediaDurationConflictError, type VideoInput, } from './publisher.js';
|
|
21
|
+
export { openReadSession } from './read-session.js';
|
|
21
22
|
export { type ClearManualReadStateOptions, type ContentStateKey, clearManualReadState, clearReaderHistory, DEFAULT_READER_STATE_BATCH_SIZE, deleteReaderState, exportReaderStatePage, getReaderState, getReaderStateBatch, listReaderState, MAX_READER_STATE_BATCH_SIZE, READER_AUTOMATIC_COMPLETION_BPS, type ReaderBehavioralConsent, type ReaderPreferences, type ReaderPreferenceValue, ReaderStateConflictError, ReaderStateDurableStateError, type ReaderStateExportPage, ReaderStateInputError, type ReaderStateListOptions, type ReaderStateMutationResult, type ReaderStatePage, type ReaderStateRecord, type ReaderStateScope, type RecordReaderOpenOptions, type RecordReaderProgressOptions, recordReaderOpen, recordReaderProgress, recordReaderUnlock, type SetManualReadStateOptions, type SetReaderPreferencesOptions, type SetSavedStateOptions, setManualReadState, setReaderPreferences, setSavedState, } from './reader-state.js';
|
|
22
23
|
export { type ContentRevisionPayload, createRevisionWithDelta, getRevision, listRevisions, type RevisionSummary, restoreRevision, } from './revisions.js';
|
|
23
24
|
export { decodeHeadingEntities, type SanitizeOptions, sanitize, sanitizeBody, stripOverEscapes, } from './sanitize.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,aAAa,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEnE,OAAO,EACN,kBAAkB,EAClB,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC7B,kBAAkB,EAClB,wBAAwB,GACxB,MAAM,aAAa,CAAA;AACpB,OAAO,EACN,6BAA6B,EAC7B,KAAK,2BAA2B,GAChC,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,SAAS,EACT,KAAK,oBAAoB,EACzB,kBAAkB,EAClB,eAAe,EACf,KAAK,0BAA0B,EAC/B,qBAAqB,EACrB,KAAK,oBAAoB,EACzB,eAAe,EACf,KAAK,oBAAoB,EACzB,eAAe,GACf,MAAM,iBAAiB,CAAA;AAExB,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,YAAY,EACZ,aAAa,EACb,iBAAiB,GACjB,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EACN,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,EACT,KAAK,kBAAkB,EACvB,eAAe,GACf,MAAM,eAAe,CAAA;AAEtB,OAAO,EACN,KAAK,eAAe,EACpB,oBAAoB,EACpB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,0BAA0B,EAC1B,oBAAoB,EACpB,wBAAwB,GACxB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EACN,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,gBAAgB,EAChB,eAAe,GACf,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,mBAAmB,EAAE,KAAK,sBAAsB,EAAE,MAAM,WAAW,CAAA;AAE5E,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
package/dist/engine/index.js
CHANGED
|
@@ -39,6 +39,7 @@ export { evaluateArticleBody, publishGuardResponseOrNull, } from './publish-guar
|
|
|
39
39
|
export { getPublishedContentById, getPublishedContentBySlug, listPublishedContent, MAX_PUBLISHED_CONTENT_PAGE_BYTES, MAX_PUBLISHED_CONTENT_PAGE_SIZE, MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES, PublishedContentReadError, } from './published-content.js';
|
|
40
40
|
// The publishing engine — content data-access core.
|
|
41
41
|
export { assertContentBodyValidForPublish, claimScheduledForPublish, countWords, createContent, createRevision, duplicateContentItem, ensureUniqueSlug, estimateReadTime, evaluateContentBodyForPublish, getContentItem, getContentRelations, getContentSnapshot, getContentTagPairs, MAX_ITEM_TAG_COUNT, MAX_ITEM_TAGS_TOTAL_BYTES, MAX_TAG_LABEL_BYTES, PublishContentValidationError, publishContent, scheduleContent, setContentRelations, setContentTags, TagInputError, unpublishContent, updateContentItem, VerifiedMediaDurationConflictError, } from './publisher.js';
|
|
42
|
+
export { openReadSession } from './read-session.js';
|
|
42
43
|
// Verified-user/site reader product state. Analytics remains observation-only.
|
|
43
44
|
export { clearManualReadState, clearReaderHistory, DEFAULT_READER_STATE_BATCH_SIZE, deleteReaderState, exportReaderStatePage, getReaderState, getReaderStateBatch, listReaderState, MAX_READER_STATE_BATCH_SIZE, READER_AUTOMATIC_COMPLETION_BPS, ReaderStateConflictError, ReaderStateDurableStateError, ReaderStateInputError, recordReaderOpen, recordReaderProgress, recordReaderUnlock, setManualReadState, setReaderPreferences, setSavedState, } from './reader-state.js';
|
|
44
45
|
// Revision engine — snapshot + word-delta history + restore.
|
package/dist/engine/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,6 +29,16 @@ export interface ListPublishedContentOptions {
|
|
|
29
29
|
channel?: string;
|
|
30
30
|
limit?: number;
|
|
31
31
|
cursor?: PublishedContentCursor | null;
|
|
32
|
+
/**
|
|
33
|
+
* `false` strips `content.body_markdown` / `content.body_html` from each
|
|
34
|
+
* payload IN SQL, so corpus snapshots (lists, navs, hubs) stop hauling the
|
|
35
|
+
* full article bodies — measured 17.2 MB → 0.4 MB for a 203-article corpus.
|
|
36
|
+
* Precomputed `content.word_count` / `content.read_time_minutes` survive,
|
|
37
|
+
* so summaries keep read-time without the body. Routes that render a body
|
|
38
|
+
* fetch it per item (`getPublishedContentBySlug`). Defaults to `true`
|
|
39
|
+
* (full payloads, byte-identical to prior behavior).
|
|
40
|
+
*/
|
|
41
|
+
bodies?: boolean;
|
|
32
42
|
}
|
|
33
43
|
export interface PublishedContentPage {
|
|
34
44
|
items: PublishedContent[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"published-content.d.ts","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EACN,KAAK,eAAe,EAGpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"published-content.d.ts","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,EACN,KAAK,eAAe,EAGpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEzC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAS5D,eAAO,MAAM,+BAA+B,MAAM,CAAA;AAClD,eAAO,MAAM,mCAAmC,QAAkB,CAAA;AAClE,eAAO,MAAM,gCAAgC,QAAkB,CAAA;AAU/D,MAAM,MAAM,6BAA6B,GACtC,iCAAiC,GACjC,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAC3B,kCAAkC,GAClC,0BAA0B,GAC1B,uBAAuB,CAAA;AAE1B,qBAAa,yBAA0B,SAAQ,KAAK;IAElD,QAAQ,CAAC,IAAI,EAAE,6BAA6B;gBAAnC,IAAI,EAAE,6BAA6B,EAC5C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY;CAKvB;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,sBAAsB,CAAA;IAC/B,QAAQ,EAAE,eAAe,CAAA;CACzB;AAED,MAAM,WAAW,sBAAsB;IACtC,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC3C,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAAA;IACtC;;;;;;;;OAQG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,gBAAgB,EAAE,CAAA;IACzB,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAA;CACzC;AA8SD,wBAAsB,uBAAuB,CAC5C,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAsBlC;AAED,wBAAsB,yBAAyB,CAC9C,EAAE,EAAE,UAAU,EACd,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA6BlC;AA8FD,wBAAsB,oBAAoB,CACzC,EAAE,EAAE,UAAU,EACd,OAAO,GAAE,2BAAgC,GACvC,OAAO,CAAC,oBAAoB,CAAC,CAoI/B"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { ContentMetadataError, parseContentMetadata, } from './content-metadata.js';
|
|
2
|
+
import { openReadSession } from './read-session.js';
|
|
2
3
|
import { TagInputError, validateRevisionTaxonomy } from './taxonomy.js';
|
|
3
4
|
const CONTENT_TYPES = new Set(['article', 'video', 'podcast', 'newsletter', 'page']);
|
|
4
5
|
const CONTENT_STATUSES = new Set(['draft', 'scheduled', 'review', 'published', 'archived']);
|
|
5
6
|
const CONTENT_VISIBILITIES = new Set(['free', 'premium']);
|
|
6
|
-
const LIST_OPTION_KEYS = new Set(['type', 'channel', 'limit', 'cursor']);
|
|
7
|
+
const LIST_OPTION_KEYS = new Set(['type', 'channel', 'limit', 'cursor', 'bodies']);
|
|
7
8
|
const CURSOR_KEYS = new Set(['publishedAt', 'contentId']);
|
|
8
9
|
export const MAX_PUBLISHED_CONTENT_PAGE_SIZE = 100;
|
|
9
10
|
export const MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES = 4 * 1024 * 1024;
|
|
@@ -38,6 +39,26 @@ SELECT
|
|
|
38
39
|
length(CAST(cr.payload_json AS BLOB)) AS payload_bytes
|
|
39
40
|
FROM content_items ci
|
|
40
41
|
`;
|
|
42
|
+
// bodies:false variant — the SAME row shape with the body fields removed in
|
|
43
|
+
// SQL. Every byte accounting downstream (page budget, per-item cap, the
|
|
44
|
+
// changed-during-read integrity check) uses the STRIPPED length consistently,
|
|
45
|
+
// so the contracts hold with no special cases.
|
|
46
|
+
const BODYLESS_PAYLOAD_EXPR = `json_remove(cr.payload_json, '$.content.body_markdown', '$.content.body_html')`;
|
|
47
|
+
const SELECT_PUBLISHED_CONTENT_BODYLESS = `
|
|
48
|
+
SELECT
|
|
49
|
+
ci.id AS content_id,
|
|
50
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
51
|
+
ci.published_at AS canonical_published_at,
|
|
52
|
+
cr.id AS revision_id,
|
|
53
|
+
cr.content_id AS revision_content_id,
|
|
54
|
+
CASE
|
|
55
|
+
WHEN length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) <= ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES}
|
|
56
|
+
THEN ${BODYLESS_PAYLOAD_EXPR}
|
|
57
|
+
ELSE NULL
|
|
58
|
+
END AS payload_json,
|
|
59
|
+
length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) AS payload_bytes
|
|
60
|
+
FROM content_items ci
|
|
61
|
+
`;
|
|
41
62
|
const SELECT_PUBLISHED_CONTENT_OUTLINE = `
|
|
42
63
|
SELECT
|
|
43
64
|
ci.id AS content_id,
|
|
@@ -46,6 +67,14 @@ SELECT
|
|
|
46
67
|
length(CAST(cr.payload_json AS BLOB)) AS payload_bytes
|
|
47
68
|
FROM content_items ci
|
|
48
69
|
`;
|
|
70
|
+
const SELECT_PUBLISHED_CONTENT_OUTLINE_BODYLESS = `
|
|
71
|
+
SELECT
|
|
72
|
+
ci.id AS content_id,
|
|
73
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
74
|
+
ci.published_at AS canonical_published_at,
|
|
75
|
+
length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) AS payload_bytes
|
|
76
|
+
FROM content_items ci
|
|
77
|
+
`;
|
|
49
78
|
const SELECT_PUBLISHED_CONTENT_BY_SLUG = `
|
|
50
79
|
SELECT
|
|
51
80
|
ci.id AS content_id,
|
|
@@ -76,7 +105,7 @@ function byteLength(value) {
|
|
|
76
105
|
function invalidPayload(message) {
|
|
77
106
|
throw new PublishedContentReadError('published_payload_invalid', message);
|
|
78
107
|
}
|
|
79
|
-
function validatePayload(raw, row) {
|
|
108
|
+
function validatePayload(raw, row, requireBodies = true) {
|
|
80
109
|
if (byteLength(raw) > MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES) {
|
|
81
110
|
throw new PublishedContentReadError('published_payload_limit_exceeded', `published revision payload exceeds ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES} bytes`);
|
|
82
111
|
}
|
|
@@ -151,7 +180,11 @@ function validatePayload(raw, row) {
|
|
|
151
180
|
if (!content)
|
|
152
181
|
return invalidPayload('published revision content is missing');
|
|
153
182
|
if (['article', 'newsletter', 'page'].includes(item.type) &&
|
|
154
|
-
typeof content.body_markdown !== 'string'
|
|
183
|
+
typeof content.body_markdown !== 'string' &&
|
|
184
|
+
// A bodies:false read strips the body fields in SQL; absent is the
|
|
185
|
+
// expected shape there, but a present-yet-non-string body is still
|
|
186
|
+
// corrupt in every mode.
|
|
187
|
+
(requireBodies || content.body_markdown !== undefined)) {
|
|
155
188
|
return invalidPayload('published revision body Markdown is invalid');
|
|
156
189
|
}
|
|
157
190
|
if (item.type === 'video' && typeof content.video_id !== 'string') {
|
|
@@ -162,7 +195,7 @@ function validatePayload(raw, row) {
|
|
|
162
195
|
}
|
|
163
196
|
return decoded;
|
|
164
197
|
}
|
|
165
|
-
function decodePublishedContent(row) {
|
|
198
|
+
function decodePublishedContent(row, requireBodies = true) {
|
|
166
199
|
if (!row.revision_id || !row.revision_content_id || row.payload_bytes === null) {
|
|
167
200
|
throw new PublishedContentReadError('published_revision_missing', 'canonical publication pointer does not resolve to a revision');
|
|
168
201
|
}
|
|
@@ -181,7 +214,7 @@ function decodePublishedContent(row) {
|
|
|
181
214
|
if (!Number.isSafeInteger(row.canonical_published_at) || row.canonical_published_at < 0) {
|
|
182
215
|
throw new PublishedContentReadError('published_payload_invalid', 'canonical published_at is invalid');
|
|
183
216
|
}
|
|
184
|
-
const payload = validatePayload(row.payload_json, row);
|
|
217
|
+
const payload = validatePayload(row.payload_json, row, requireBodies);
|
|
185
218
|
const item = payload.item;
|
|
186
219
|
let metadata;
|
|
187
220
|
try {
|
|
@@ -217,7 +250,8 @@ function wrapReadError(error) {
|
|
|
217
250
|
export async function getPublishedContentById(db, contentId) {
|
|
218
251
|
assertLookupValue(contentId, 'contentId', 256);
|
|
219
252
|
try {
|
|
220
|
-
const
|
|
253
|
+
const reader = openReadSession(db);
|
|
254
|
+
const row = await reader
|
|
221
255
|
.prepare(`${SELECT_PUBLISHED_CONTENT}
|
|
222
256
|
LEFT JOIN content_revisions cr
|
|
223
257
|
ON cr.id = ci.published_revision_id
|
|
@@ -238,7 +272,8 @@ LIMIT 1`)
|
|
|
238
272
|
export async function getPublishedContentBySlug(db, slug) {
|
|
239
273
|
assertLookupValue(slug, 'slug', 512);
|
|
240
274
|
try {
|
|
241
|
-
const
|
|
275
|
+
const reader = openReadSession(db);
|
|
276
|
+
const result = await reader
|
|
242
277
|
.prepare(`${SELECT_PUBLISHED_CONTENT_BY_SLUG}
|
|
243
278
|
WHERE ci.status = 'published'
|
|
244
279
|
AND ci.deleted_at IS NULL
|
|
@@ -304,8 +339,16 @@ function normalizeListOptions(options) {
|
|
|
304
339
|
contentId: options.cursor.contentId,
|
|
305
340
|
};
|
|
306
341
|
}
|
|
342
|
+
let bodies = true;
|
|
343
|
+
if (options.bodies !== undefined) {
|
|
344
|
+
if (typeof options.bodies !== 'boolean') {
|
|
345
|
+
throw new PublishedContentReadError('published_content_input_invalid', 'bodies must be a boolean');
|
|
346
|
+
}
|
|
347
|
+
bodies = options.bodies;
|
|
348
|
+
}
|
|
307
349
|
return {
|
|
308
350
|
limit,
|
|
351
|
+
bodies,
|
|
309
352
|
type,
|
|
310
353
|
channel,
|
|
311
354
|
cursor,
|
|
@@ -333,8 +376,9 @@ export async function listPublishedContent(db, options = {}) {
|
|
|
333
376
|
values.push(normalized.cursor.publishedAt, normalized.cursor.publishedAt, normalized.cursor.contentId);
|
|
334
377
|
}
|
|
335
378
|
try {
|
|
336
|
-
const
|
|
337
|
-
|
|
379
|
+
const reader = openReadSession(db);
|
|
380
|
+
const outlineResult = await reader
|
|
381
|
+
.prepare(`${normalized.bodies ? SELECT_PUBLISHED_CONTENT_OUTLINE : SELECT_PUBLISHED_CONTENT_OUTLINE_BODYLESS}
|
|
338
382
|
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
339
383
|
WHERE ${predicates.join('\n AND ')}
|
|
340
384
|
ORDER BY ci.published_at DESC, ci.id DESC
|
|
@@ -367,25 +411,32 @@ LIMIT ?`)
|
|
|
367
411
|
return { items: [], nextCursor: null };
|
|
368
412
|
// Hydrate the selected outlines in bound-variable-safe chunks. Each chunk
|
|
369
413
|
// binds two variables per outline; capping at MAX_HYDRATE_CHUNK_OUTLINES
|
|
370
|
-
// keeps every statement at or under D1's 100-variable limit.
|
|
371
|
-
//
|
|
372
|
-
//
|
|
373
|
-
|
|
414
|
+
// keeps every statement at or under D1's 100-variable limit. Chunks are
|
|
415
|
+
// independent point lookups pinned to exact (id, revision) pairs, so they
|
|
416
|
+
// run concurrently — one round-trip wave instead of a sequential chain.
|
|
417
|
+
// Rows merge into one pointer-keyed map, so ordering and the per-item
|
|
418
|
+
// integrity checks below are identical to a single-statement hydrate.
|
|
419
|
+
const chunks = [];
|
|
374
420
|
for (let offset = 0; offset < selected.length; offset += MAX_HYDRATE_CHUNK_OUTLINES) {
|
|
375
|
-
|
|
421
|
+
chunks.push(selected.slice(offset, offset + MAX_HYDRATE_CHUNK_OUTLINES));
|
|
422
|
+
}
|
|
423
|
+
const chunkResults = await Promise.all(chunks.map((chunk) => {
|
|
376
424
|
const chunkPredicates = chunk.map(() => '(ci.id = ? AND ci.published_revision_id = ?)');
|
|
377
425
|
const chunkValues = chunk.flatMap((outline) => [
|
|
378
426
|
outline.content_id,
|
|
379
427
|
outline.pointer_revision_id,
|
|
380
428
|
]);
|
|
381
|
-
|
|
382
|
-
.prepare(`${SELECT_PUBLISHED_CONTENT}
|
|
429
|
+
return reader
|
|
430
|
+
.prepare(`${normalized.bodies ? SELECT_PUBLISHED_CONTENT : SELECT_PUBLISHED_CONTENT_BODYLESS}
|
|
383
431
|
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
384
432
|
WHERE ci.status = 'published'
|
|
385
433
|
AND ci.deleted_at IS NULL
|
|
386
434
|
AND (${chunkPredicates.join(' OR ')})`)
|
|
387
435
|
.bind(...chunkValues)
|
|
388
436
|
.all();
|
|
437
|
+
}));
|
|
438
|
+
const rowsByPointer = new Map();
|
|
439
|
+
for (const chunkResult of chunkResults) {
|
|
389
440
|
for (const row of chunkResult.results ?? []) {
|
|
390
441
|
rowsByPointer.set(`${row.content_id}\0${row.pointer_revision_id}`, row);
|
|
391
442
|
}
|
|
@@ -398,7 +449,7 @@ WHERE ci.status = 'published'
|
|
|
398
449
|
byteLength(row.payload_json) !== outline.payload_bytes) {
|
|
399
450
|
throw new PublishedContentReadError('published_read_failed', 'published revision changed during its bounded read');
|
|
400
451
|
}
|
|
401
|
-
return decodePublishedContent(row);
|
|
452
|
+
return decodePublishedContent(row, normalized.bodies);
|
|
402
453
|
});
|
|
403
454
|
const hasMore = outlines.length > selected.length;
|
|
404
455
|
const last = items.at(-1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"published-content.js","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"published-content.js","sourceRoot":"","sources":["../../src/engine/published-content.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { D1Database } from './d1.js';
|
|
2
|
+
/**
|
|
3
|
+
* Route reads through a D1 read-replica session when the runtime supports it.
|
|
4
|
+
*
|
|
5
|
+
* `first-unconstrained` sends the first query to the nearest replica and
|
|
6
|
+
* threads the session bookmark through every subsequent query, so reads are
|
|
7
|
+
* sequentially consistent within the session while avoiding the cross-region
|
|
8
|
+
* primary round-trip that dominates SSR wall time (450ms × N sequential
|
|
9
|
+
* statements). Requires read replication to be enabled on the database
|
|
10
|
+
* (`read_replication.mode: auto`); without it — or on runtimes whose binding
|
|
11
|
+
* has no `withSession` — this returns the binding unchanged, which is exactly
|
|
12
|
+
* the pre-session behavior. That fallback is silent by design: the synthetic
|
|
13
|
+
* render canaries that page on slow pages are the loud surface for a
|
|
14
|
+
* replication regression.
|
|
15
|
+
*
|
|
16
|
+
* Reads only: callers that write must keep using the raw binding. (D1 forwards
|
|
17
|
+
* session writes to the primary, so a stray write through a session is routed
|
|
18
|
+
* correctly — but the engine's read model never writes.) A write through the
|
|
19
|
+
* raw binding is NOT immediately visible to this session's replica reads;
|
|
20
|
+
* public serving tolerates that eventual consistency, and admin
|
|
21
|
+
* read-after-write flows use the engine's primary-bound reads instead.
|
|
22
|
+
*/
|
|
23
|
+
export declare function openReadSession(db: D1Database): D1Database;
|
|
24
|
+
//# sourceMappingURL=read-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-session.d.ts","sourceRoot":"","sources":["../../src/engine/read-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAczC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,CAO1D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// One read session per D1 binding IDENTITY. workerd binding objects are
|
|
2
|
+
// isolate-stable, so on a warm isolate this session is shared by every request
|
|
3
|
+
// for the isolate's lifetime — deliberately: D1 session bookmarks only
|
|
4
|
+
// advance, so every read through the session is monotonic (it observes a
|
|
5
|
+
// database state at least as new as any state previously observed through the
|
|
6
|
+
// session). That is a strictly stronger guarantee than per-request sessions
|
|
7
|
+
// would give, and it is what keeps cursor pagination coherent across the
|
|
8
|
+
// multiple statements of a corpus load. On runtimes that hand out fresh
|
|
9
|
+
// binding objects per request the cache simply misses and each request gets
|
|
10
|
+
// its own session, which is also correct.
|
|
11
|
+
const sessionsByBinding = new WeakMap();
|
|
12
|
+
/**
|
|
13
|
+
* Route reads through a D1 read-replica session when the runtime supports it.
|
|
14
|
+
*
|
|
15
|
+
* `first-unconstrained` sends the first query to the nearest replica and
|
|
16
|
+
* threads the session bookmark through every subsequent query, so reads are
|
|
17
|
+
* sequentially consistent within the session while avoiding the cross-region
|
|
18
|
+
* primary round-trip that dominates SSR wall time (450ms × N sequential
|
|
19
|
+
* statements). Requires read replication to be enabled on the database
|
|
20
|
+
* (`read_replication.mode: auto`); without it — or on runtimes whose binding
|
|
21
|
+
* has no `withSession` — this returns the binding unchanged, which is exactly
|
|
22
|
+
* the pre-session behavior. That fallback is silent by design: the synthetic
|
|
23
|
+
* render canaries that page on slow pages are the loud surface for a
|
|
24
|
+
* replication regression.
|
|
25
|
+
*
|
|
26
|
+
* Reads only: callers that write must keep using the raw binding. (D1 forwards
|
|
27
|
+
* session writes to the primary, so a stray write through a session is routed
|
|
28
|
+
* correctly — but the engine's read model never writes.) A write through the
|
|
29
|
+
* raw binding is NOT immediately visible to this session's replica reads;
|
|
30
|
+
* public serving tolerates that eventual consistency, and admin
|
|
31
|
+
* read-after-write flows use the engine's primary-bound reads instead.
|
|
32
|
+
*/
|
|
33
|
+
export function openReadSession(db) {
|
|
34
|
+
if (typeof db.withSession !== 'function')
|
|
35
|
+
return db;
|
|
36
|
+
const cached = sessionsByBinding.get(db);
|
|
37
|
+
if (cached)
|
|
38
|
+
return cached;
|
|
39
|
+
const session = db.withSession('first-unconstrained');
|
|
40
|
+
sessionsByBinding.set(db, session);
|
|
41
|
+
return session;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=read-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-session.js","sourceRoot":"","sources":["../../src/engine/read-session.ts"],"names":[],"mappings":"AAEA,wEAAwE;AACxE,+EAA+E;AAC/E,uEAAuE;AACvE,yEAAyE;AACzE,8EAA8E;AAC9E,4EAA4E;AAC5E,yEAAyE;AACzE,wEAAwE;AACxE,4EAA4E;AAC5E,0CAA0C;AAC1C,MAAM,iBAAiB,GAAG,IAAI,OAAO,EAAsB,CAAA;AAE3D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,eAAe,CAAC,EAAc;IAC7C,IAAI,OAAO,EAAE,CAAC,WAAW,KAAK,UAAU;QAAE,OAAO,EAAE,CAAA;IACnD,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACxC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAA;IACrD,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAClC,OAAO,OAAO,CAAA;AACf,CAAC"}
|
package/package.json
CHANGED
package/src/engine/d1.ts
CHANGED
|
@@ -26,4 +26,26 @@ export interface D1PreparedStatement {
|
|
|
26
26
|
export interface D1Database {
|
|
27
27
|
prepare(query: string): D1PreparedStatement
|
|
28
28
|
batch(statements: D1PreparedStatement[]): Promise<D1Result[]>
|
|
29
|
+
/**
|
|
30
|
+
* The D1 Sessions API entry point (present on real workerd bindings; absent
|
|
31
|
+
* on some local shims). A session routes reads to the nearest read replica
|
|
32
|
+
* with sequential consistency inside the session; writes still reach the
|
|
33
|
+
* primary. Optional so structural fakes without it remain assignable —
|
|
34
|
+
* callers must feature-check (see `openReadSession`).
|
|
35
|
+
*/
|
|
36
|
+
withSession?(constraint?: string): D1DatabaseSession
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The session handle returned by `withSession`. Structurally the same
|
|
41
|
+
* prepare/batch surface the engine reads through — it deliberately omits
|
|
42
|
+
* `withSession` itself (sessions do not nest). `getBookmark` returns the
|
|
43
|
+
* session's latest observed commit token (null until the first query
|
|
44
|
+
* completes) — D1's mechanism for carrying consistency across sessions,
|
|
45
|
+
* requests, or a write on the raw binding followed by a session read.
|
|
46
|
+
*/
|
|
47
|
+
export interface D1DatabaseSession {
|
|
48
|
+
prepare(query: string): D1PreparedStatement
|
|
49
|
+
batch(statements: D1PreparedStatement[]): Promise<D1Result[]>
|
|
50
|
+
getBookmark?(): string | null
|
|
29
51
|
}
|
package/src/engine/index.ts
CHANGED
|
@@ -73,7 +73,7 @@ export {
|
|
|
73
73
|
// Scheduled-publish sweep.
|
|
74
74
|
export { runScheduledPublish, type ScheduledPublishResult } from './cron.js'
|
|
75
75
|
// The injected D1 surface the engine operates over.
|
|
76
|
-
export type { D1Database, D1PreparedStatement, D1Result } from './d1.js'
|
|
76
|
+
export type { D1Database, D1DatabaseSession, D1PreparedStatement, D1Result } from './d1.js'
|
|
77
77
|
// Foundry dispatch + HMAC callback engine (P3 Task 5 / bead-08).
|
|
78
78
|
export {
|
|
79
79
|
applyFoundryCallback,
|
|
@@ -226,6 +226,7 @@ export {
|
|
|
226
226
|
VerifiedMediaDurationConflictError,
|
|
227
227
|
type VideoInput,
|
|
228
228
|
} from './publisher.js'
|
|
229
|
+
export { openReadSession } from './read-session.js'
|
|
229
230
|
// Verified-user/site reader product state. Analytics remains observation-only.
|
|
230
231
|
export {
|
|
231
232
|
type ClearManualReadStateOptions,
|
|
@@ -5,13 +5,14 @@ import {
|
|
|
5
5
|
parseContentMetadata,
|
|
6
6
|
} from './content-metadata.js'
|
|
7
7
|
import type { D1Database } from './d1.js'
|
|
8
|
+
import { openReadSession } from './read-session.js'
|
|
8
9
|
import type { ContentRevisionPayload } from './revisions.js'
|
|
9
10
|
import { TagInputError, validateRevisionTaxonomy } from './taxonomy.js'
|
|
10
11
|
|
|
11
12
|
const CONTENT_TYPES = new Set<ContentType>(['article', 'video', 'podcast', 'newsletter', 'page'])
|
|
12
13
|
const CONTENT_STATUSES = new Set(['draft', 'scheduled', 'review', 'published', 'archived'])
|
|
13
14
|
const CONTENT_VISIBILITIES = new Set(['free', 'premium'])
|
|
14
|
-
const LIST_OPTION_KEYS = new Set(['type', 'channel', 'limit', 'cursor'])
|
|
15
|
+
const LIST_OPTION_KEYS = new Set(['type', 'channel', 'limit', 'cursor', 'bodies'])
|
|
15
16
|
const CURSOR_KEYS = new Set(['publishedAt', 'contentId'])
|
|
16
17
|
|
|
17
18
|
export const MAX_PUBLISHED_CONTENT_PAGE_SIZE = 100
|
|
@@ -67,6 +68,16 @@ export interface ListPublishedContentOptions {
|
|
|
67
68
|
channel?: string
|
|
68
69
|
limit?: number
|
|
69
70
|
cursor?: PublishedContentCursor | null
|
|
71
|
+
/**
|
|
72
|
+
* `false` strips `content.body_markdown` / `content.body_html` from each
|
|
73
|
+
* payload IN SQL, so corpus snapshots (lists, navs, hubs) stop hauling the
|
|
74
|
+
* full article bodies — measured 17.2 MB → 0.4 MB for a 203-article corpus.
|
|
75
|
+
* Precomputed `content.word_count` / `content.read_time_minutes` survive,
|
|
76
|
+
* so summaries keep read-time without the body. Routes that render a body
|
|
77
|
+
* fetch it per item (`getPublishedContentBySlug`). Defaults to `true`
|
|
78
|
+
* (full payloads, byte-identical to prior behavior).
|
|
79
|
+
*/
|
|
80
|
+
bodies?: boolean
|
|
70
81
|
}
|
|
71
82
|
|
|
72
83
|
export interface PublishedContentPage {
|
|
@@ -107,6 +118,27 @@ SELECT
|
|
|
107
118
|
FROM content_items ci
|
|
108
119
|
`
|
|
109
120
|
|
|
121
|
+
// bodies:false variant — the SAME row shape with the body fields removed in
|
|
122
|
+
// SQL. Every byte accounting downstream (page budget, per-item cap, the
|
|
123
|
+
// changed-during-read integrity check) uses the STRIPPED length consistently,
|
|
124
|
+
// so the contracts hold with no special cases.
|
|
125
|
+
const BODYLESS_PAYLOAD_EXPR = `json_remove(cr.payload_json, '$.content.body_markdown', '$.content.body_html')`
|
|
126
|
+
const SELECT_PUBLISHED_CONTENT_BODYLESS = `
|
|
127
|
+
SELECT
|
|
128
|
+
ci.id AS content_id,
|
|
129
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
130
|
+
ci.published_at AS canonical_published_at,
|
|
131
|
+
cr.id AS revision_id,
|
|
132
|
+
cr.content_id AS revision_content_id,
|
|
133
|
+
CASE
|
|
134
|
+
WHEN length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) <= ${MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES}
|
|
135
|
+
THEN ${BODYLESS_PAYLOAD_EXPR}
|
|
136
|
+
ELSE NULL
|
|
137
|
+
END AS payload_json,
|
|
138
|
+
length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) AS payload_bytes
|
|
139
|
+
FROM content_items ci
|
|
140
|
+
`
|
|
141
|
+
|
|
110
142
|
const SELECT_PUBLISHED_CONTENT_OUTLINE = `
|
|
111
143
|
SELECT
|
|
112
144
|
ci.id AS content_id,
|
|
@@ -116,6 +148,15 @@ SELECT
|
|
|
116
148
|
FROM content_items ci
|
|
117
149
|
`
|
|
118
150
|
|
|
151
|
+
const SELECT_PUBLISHED_CONTENT_OUTLINE_BODYLESS = `
|
|
152
|
+
SELECT
|
|
153
|
+
ci.id AS content_id,
|
|
154
|
+
ci.published_revision_id AS pointer_revision_id,
|
|
155
|
+
ci.published_at AS canonical_published_at,
|
|
156
|
+
length(CAST(${BODYLESS_PAYLOAD_EXPR} AS BLOB)) AS payload_bytes
|
|
157
|
+
FROM content_items ci
|
|
158
|
+
`
|
|
159
|
+
|
|
119
160
|
const SELECT_PUBLISHED_CONTENT_BY_SLUG = `
|
|
120
161
|
SELECT
|
|
121
162
|
ci.id AS content_id,
|
|
@@ -149,7 +190,11 @@ function invalidPayload(message: string): never {
|
|
|
149
190
|
throw new PublishedContentReadError('published_payload_invalid', message)
|
|
150
191
|
}
|
|
151
192
|
|
|
152
|
-
function validatePayload(
|
|
193
|
+
function validatePayload(
|
|
194
|
+
raw: string,
|
|
195
|
+
row: PublishedContentRow,
|
|
196
|
+
requireBodies = true,
|
|
197
|
+
): ContentRevisionPayload {
|
|
153
198
|
if (byteLength(raw) > MAX_PUBLISHED_CONTENT_PAYLOAD_BYTES) {
|
|
154
199
|
throw new PublishedContentReadError(
|
|
155
200
|
'published_payload_limit_exceeded',
|
|
@@ -233,7 +278,11 @@ function validatePayload(raw: string, row: PublishedContentRow): ContentRevision
|
|
|
233
278
|
if (!content) return invalidPayload('published revision content is missing')
|
|
234
279
|
if (
|
|
235
280
|
['article', 'newsletter', 'page'].includes(item.type as string) &&
|
|
236
|
-
typeof content.body_markdown !== 'string'
|
|
281
|
+
typeof content.body_markdown !== 'string' &&
|
|
282
|
+
// A bodies:false read strips the body fields in SQL; absent is the
|
|
283
|
+
// expected shape there, but a present-yet-non-string body is still
|
|
284
|
+
// corrupt in every mode.
|
|
285
|
+
(requireBodies || content.body_markdown !== undefined)
|
|
237
286
|
) {
|
|
238
287
|
return invalidPayload('published revision body Markdown is invalid')
|
|
239
288
|
}
|
|
@@ -247,7 +296,7 @@ function validatePayload(raw: string, row: PublishedContentRow): ContentRevision
|
|
|
247
296
|
return decoded as unknown as ContentRevisionPayload
|
|
248
297
|
}
|
|
249
298
|
|
|
250
|
-
function decodePublishedContent(row: PublishedContentRow): PublishedContent {
|
|
299
|
+
function decodePublishedContent(row: PublishedContentRow, requireBodies = true): PublishedContent {
|
|
251
300
|
if (!row.revision_id || !row.revision_content_id || row.payload_bytes === null) {
|
|
252
301
|
throw new PublishedContentReadError(
|
|
253
302
|
'published_revision_missing',
|
|
@@ -285,7 +334,7 @@ function decodePublishedContent(row: PublishedContentRow): PublishedContent {
|
|
|
285
334
|
)
|
|
286
335
|
}
|
|
287
336
|
|
|
288
|
-
const payload = validatePayload(row.payload_json, row)
|
|
337
|
+
const payload = validatePayload(row.payload_json, row, requireBodies)
|
|
289
338
|
const item = payload.item
|
|
290
339
|
let metadata: ContentMetadata
|
|
291
340
|
try {
|
|
@@ -342,7 +391,8 @@ export async function getPublishedContentById(
|
|
|
342
391
|
): Promise<PublishedContent | null> {
|
|
343
392
|
assertLookupValue(contentId, 'contentId', 256)
|
|
344
393
|
try {
|
|
345
|
-
const
|
|
394
|
+
const reader = openReadSession(db)
|
|
395
|
+
const row = await reader
|
|
346
396
|
.prepare(
|
|
347
397
|
`${SELECT_PUBLISHED_CONTENT}
|
|
348
398
|
LEFT JOIN content_revisions cr
|
|
@@ -368,7 +418,8 @@ export async function getPublishedContentBySlug(
|
|
|
368
418
|
): Promise<PublishedContent | null> {
|
|
369
419
|
assertLookupValue(slug, 'slug', 512)
|
|
370
420
|
try {
|
|
371
|
-
const
|
|
421
|
+
const reader = openReadSession(db)
|
|
422
|
+
const result = await reader
|
|
372
423
|
.prepare(
|
|
373
424
|
`${SELECT_PUBLISHED_CONTENT_BY_SLUG}
|
|
374
425
|
WHERE ci.status = 'published'
|
|
@@ -397,6 +448,7 @@ LIMIT 2`,
|
|
|
397
448
|
|
|
398
449
|
function normalizeListOptions(options: unknown): {
|
|
399
450
|
limit: number
|
|
451
|
+
bodies: boolean
|
|
400
452
|
type?: ContentType
|
|
401
453
|
channel?: string
|
|
402
454
|
cursor?: PublishedContentCursor
|
|
@@ -467,8 +519,19 @@ function normalizeListOptions(options: unknown): {
|
|
|
467
519
|
contentId: options.cursor.contentId,
|
|
468
520
|
}
|
|
469
521
|
}
|
|
522
|
+
let bodies = true
|
|
523
|
+
if (options.bodies !== undefined) {
|
|
524
|
+
if (typeof options.bodies !== 'boolean') {
|
|
525
|
+
throw new PublishedContentReadError(
|
|
526
|
+
'published_content_input_invalid',
|
|
527
|
+
'bodies must be a boolean',
|
|
528
|
+
)
|
|
529
|
+
}
|
|
530
|
+
bodies = options.bodies
|
|
531
|
+
}
|
|
470
532
|
return {
|
|
471
533
|
limit,
|
|
534
|
+
bodies,
|
|
472
535
|
type,
|
|
473
536
|
channel,
|
|
474
537
|
cursor,
|
|
@@ -504,9 +567,10 @@ export async function listPublishedContent(
|
|
|
504
567
|
)
|
|
505
568
|
}
|
|
506
569
|
try {
|
|
507
|
-
const
|
|
570
|
+
const reader = openReadSession(db)
|
|
571
|
+
const outlineResult = await reader
|
|
508
572
|
.prepare(
|
|
509
|
-
`${SELECT_PUBLISHED_CONTENT_OUTLINE}
|
|
573
|
+
`${normalized.bodies ? SELECT_PUBLISHED_CONTENT_OUTLINE : SELECT_PUBLISHED_CONTENT_OUTLINE_BODYLESS}
|
|
510
574
|
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
511
575
|
WHERE ${predicates.join('\n AND ')}
|
|
512
576
|
ORDER BY ci.published_at DESC, ci.id DESC
|
|
@@ -550,27 +614,36 @@ LIMIT ?`,
|
|
|
550
614
|
|
|
551
615
|
// Hydrate the selected outlines in bound-variable-safe chunks. Each chunk
|
|
552
616
|
// binds two variables per outline; capping at MAX_HYDRATE_CHUNK_OUTLINES
|
|
553
|
-
// keeps every statement at or under D1's 100-variable limit.
|
|
554
|
-
//
|
|
555
|
-
//
|
|
556
|
-
|
|
617
|
+
// keeps every statement at or under D1's 100-variable limit. Chunks are
|
|
618
|
+
// independent point lookups pinned to exact (id, revision) pairs, so they
|
|
619
|
+
// run concurrently — one round-trip wave instead of a sequential chain.
|
|
620
|
+
// Rows merge into one pointer-keyed map, so ordering and the per-item
|
|
621
|
+
// integrity checks below are identical to a single-statement hydrate.
|
|
622
|
+
const chunks: PublishedContentOutlineRow[][] = []
|
|
557
623
|
for (let offset = 0; offset < selected.length; offset += MAX_HYDRATE_CHUNK_OUTLINES) {
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
624
|
+
chunks.push(selected.slice(offset, offset + MAX_HYDRATE_CHUNK_OUTLINES))
|
|
625
|
+
}
|
|
626
|
+
const chunkResults = await Promise.all(
|
|
627
|
+
chunks.map((chunk) => {
|
|
628
|
+
const chunkPredicates = chunk.map(() => '(ci.id = ? AND ci.published_revision_id = ?)')
|
|
629
|
+
const chunkValues = chunk.flatMap((outline) => [
|
|
630
|
+
outline.content_id,
|
|
631
|
+
outline.pointer_revision_id,
|
|
632
|
+
])
|
|
633
|
+
return reader
|
|
634
|
+
.prepare(
|
|
635
|
+
`${normalized.bodies ? SELECT_PUBLISHED_CONTENT : SELECT_PUBLISHED_CONTENT_BODYLESS}
|
|
567
636
|
JOIN content_revisions cr ON cr.id = ci.published_revision_id
|
|
568
637
|
WHERE ci.status = 'published'
|
|
569
638
|
AND ci.deleted_at IS NULL
|
|
570
639
|
AND (${chunkPredicates.join(' OR ')})`,
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
640
|
+
)
|
|
641
|
+
.bind(...chunkValues)
|
|
642
|
+
.all<PublishedContentRow>()
|
|
643
|
+
}),
|
|
644
|
+
)
|
|
645
|
+
const rowsByPointer = new Map<string, PublishedContentRow>()
|
|
646
|
+
for (const chunkResult of chunkResults) {
|
|
574
647
|
for (const row of chunkResult.results ?? []) {
|
|
575
648
|
rowsByPointer.set(`${row.content_id}\0${row.pointer_revision_id}`, row)
|
|
576
649
|
}
|
|
@@ -588,7 +661,7 @@ WHERE ci.status = 'published'
|
|
|
588
661
|
'published revision changed during its bounded read',
|
|
589
662
|
)
|
|
590
663
|
}
|
|
591
|
-
return decodePublishedContent(row)
|
|
664
|
+
return decodePublishedContent(row, normalized.bodies)
|
|
592
665
|
})
|
|
593
666
|
const hasMore = outlines.length > selected.length
|
|
594
667
|
const last = items.at(-1)
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { D1Database } from './d1.js'
|
|
2
|
+
|
|
3
|
+
// One read session per D1 binding IDENTITY. workerd binding objects are
|
|
4
|
+
// isolate-stable, so on a warm isolate this session is shared by every request
|
|
5
|
+
// for the isolate's lifetime — deliberately: D1 session bookmarks only
|
|
6
|
+
// advance, so every read through the session is monotonic (it observes a
|
|
7
|
+
// database state at least as new as any state previously observed through the
|
|
8
|
+
// session). That is a strictly stronger guarantee than per-request sessions
|
|
9
|
+
// would give, and it is what keeps cursor pagination coherent across the
|
|
10
|
+
// multiple statements of a corpus load. On runtimes that hand out fresh
|
|
11
|
+
// binding objects per request the cache simply misses and each request gets
|
|
12
|
+
// its own session, which is also correct.
|
|
13
|
+
const sessionsByBinding = new WeakMap<object, D1Database>()
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Route reads through a D1 read-replica session when the runtime supports it.
|
|
17
|
+
*
|
|
18
|
+
* `first-unconstrained` sends the first query to the nearest replica and
|
|
19
|
+
* threads the session bookmark through every subsequent query, so reads are
|
|
20
|
+
* sequentially consistent within the session while avoiding the cross-region
|
|
21
|
+
* primary round-trip that dominates SSR wall time (450ms × N sequential
|
|
22
|
+
* statements). Requires read replication to be enabled on the database
|
|
23
|
+
* (`read_replication.mode: auto`); without it — or on runtimes whose binding
|
|
24
|
+
* has no `withSession` — this returns the binding unchanged, which is exactly
|
|
25
|
+
* the pre-session behavior. That fallback is silent by design: the synthetic
|
|
26
|
+
* render canaries that page on slow pages are the loud surface for a
|
|
27
|
+
* replication regression.
|
|
28
|
+
*
|
|
29
|
+
* Reads only: callers that write must keep using the raw binding. (D1 forwards
|
|
30
|
+
* session writes to the primary, so a stray write through a session is routed
|
|
31
|
+
* correctly — but the engine's read model never writes.) A write through the
|
|
32
|
+
* raw binding is NOT immediately visible to this session's replica reads;
|
|
33
|
+
* public serving tolerates that eventual consistency, and admin
|
|
34
|
+
* read-after-write flows use the engine's primary-bound reads instead.
|
|
35
|
+
*/
|
|
36
|
+
export function openReadSession(db: D1Database): D1Database {
|
|
37
|
+
if (typeof db.withSession !== 'function') return db
|
|
38
|
+
const cached = sessionsByBinding.get(db)
|
|
39
|
+
if (cached) return cached
|
|
40
|
+
const session = db.withSession('first-unconstrained')
|
|
41
|
+
sessionsByBinding.set(db, session)
|
|
42
|
+
return session
|
|
43
|
+
}
|