@@ -42,6 +42,10 @@ export class D1RevisionCoordinator implements RevisionCoordinator {
4242 return readCommittedPointer ( this . database , version )
4343 }
4444
45+ adopt ( pointer : MarkdownPointer , version : number ) : Promise < { pointer : MarkdownPointer ; version : number } > {
46+ return adoptWordPressState ( this . database , pointer , version )
47+ }
48+
4549 async reset ( ) : Promise < void > {
4650 await resetWordPressState ( this . database )
4751 }
@@ -116,6 +120,36 @@ async function readCommittedPointer(database: D1Database, version: number): Prom
116120 return pointer
117121}
118122
123+ async function adoptWordPressState ( database : D1Database , pointer : MarkdownPointer , version : number ) : Promise < { pointer : MarkdownPointer ; version : number } > {
124+ validatePointer ( pointer )
125+ if ( ! Number . isSafeInteger ( version ) || version < 1 ) throw new RevisionConflict ( "A positive canonical version is required for D1 adoption." )
126+ await ensureSchema ( database )
127+ const now = Date . now ( )
128+ await database . batch ( [
129+ database . prepare ( `UPDATE wp_codebox_state
130+ SET revision = ?, manifest_key = ?, persisted_at = ?, version = ?,
131+ lease_token = NULL, lease_base_revision = NULL, lease_version = NULL, lease_expires_at = NULL
132+ WHERE site_id = ? AND (lease_token IS NULL OR lease_expires_at <= ?)
133+ AND ((revision IS NULL AND manifest_key IS NULL AND persisted_at IS NULL)
134+ OR (version = ? AND revision = ? AND manifest_key = ? AND persisted_at = ?))
135+ AND (NOT EXISTS (SELECT 1 FROM wp_codebox_commits WHERE site_id = ? AND version = ?)
136+ OR EXISTS (SELECT 1 FROM wp_codebox_commits WHERE site_id = ? AND version = ?
137+ AND revision = ? AND manifest_key = ? AND persisted_at = ?))` )
138+ . bind ( pointer . revision , pointer . manifestKey , pointer . persistedAt , version , SITE_ID , now ,
139+ version , pointer . revision , pointer . manifestKey , pointer . persistedAt ,
140+ SITE_ID , version , SITE_ID , version , pointer . revision , pointer . manifestKey , pointer . persistedAt ) ,
141+ database . prepare ( `INSERT OR IGNORE INTO wp_codebox_commits (site_id, version, revision, manifest_key, persisted_at)
142+ SELECT site_id, version, revision, manifest_key, persisted_at FROM wp_codebox_state
143+ WHERE site_id = ? AND version = ? AND revision = ? AND manifest_key = ? AND persisted_at = ? AND lease_token IS NULL` )
144+ . bind ( SITE_ID , version , pointer . revision , pointer . manifestKey , pointer . persistedAt ) ,
145+ ] )
146+ const [ state , committed ] = await Promise . all ( [ readRow ( database ) , readCommittedPointer ( database , version ) ] )
147+ if ( state . lease_token !== null || state . version !== version || ! samePointer ( pointerFromRow ( state ) , pointer ) || ! samePointer ( committed , pointer ) ) {
148+ throw new RevisionConflict ( "D1 coordinator adoption requires empty or exactly matching state without an active lease." , state . lease_expires_at ?? undefined )
149+ }
150+ return { pointer, version }
151+ }
152+
119153async function resetWordPressState ( database : D1Database ) : Promise < { reset : true } > {
120154 await ensureSchema ( database )
121155 await database . batch ( [
@@ -160,6 +194,10 @@ function validatePointer(pointer: unknown): asserts pointer is MarkdownPointer {
160194 }
161195}
162196
197+ function samePointer ( left : MarkdownPointer | null , right : MarkdownPointer ) : boolean {
198+ return ! ! left && left . revision === right . revision && left . manifestKey === right . manifestKey && left . persistedAt === right . persistedAt
199+ }
200+
163201function ensureSchema ( database : D1Database ) : Promise < void > {
164202 const key = database as object
165203 const existing = schemaReady . get ( key )
0 commit comments