@earth-app/collegedb 1.1.1 → 1.1.2

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/index.js CHANGED
@@ -13,9 +13,9 @@ var pJ=Object.defineProperty;var mJ=(J)=>J;function gJ(J,X){this[J]=mJ.bind(null
13
13
  created_at INTEGER NOT NULL,
14
14
  updated_at INTEGER NOT NULL
15
15
  );
16
- `).run()}if(S.set(F,!0),M&&Y.debug)console.log(`Auto-migration completed for shard ${X}: ${j} records from ${E} tables`)}catch(A){L.push(`Auto-migration error: ${A}`)}return{migrationNeeded:z,migrationPerformed:M,recordsMigrated:j,tablesProcessed:E,issues:L}}async function BJ(J,X,Y){let Z=`${X}_migration_check`;if(S.has(Z))return!1;try{let G=await b(J);if(G.includes("shard_mappings"))return S.set(Z,!0),!1;let{KVShardMapper:W}=await Promise.resolve().then(() => (p(),XJ)),H=new W(Y.kv,{hashShardMappings:Y.hashShardMappings,mappingCacheTtlMs:Y.mappingCacheTtlMs,knownShardsCacheTtlMs:Y.knownShardsCacheTtlMs}),V=G.filter((U)=>U!=="shard_mappings"&&!U.startsWith("sqlite_")&&U!=="sqlite_sequence");for(let U of V.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${U} LIMIT 1`).first())?.count||0)>0){let L=await J.prepare(`SELECT id FROM ${U} LIMIT 1`).first();if(L){let j=String(L.id);if(!await H.getShardMapping(j))return!0}}}catch{continue}return!1}catch{return!1}}function xJ(){S.clear()}function vJ(J){let X=`${J}_migration_check`;S.delete(X)}var S,YJ;var m=JJ(()=>{q();S=new Map,YJ=new Map});q();p();var y=null,h=null,u=new Map;function f(J){if(!h)h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return h}function oJ(J){y=J,h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),u.clear();try{let X=f(J);Promise.resolve().then(async()=>{let Y=await X.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(J.shards)]));await X.setKnownShards(Z)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)NJ(J).catch((X)=>{console.warn("Background auto-migration failed:",X)})}async function MJ(J){y=J,h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),u.clear();try{let X=f(J),Y=await X.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(J.shards)]));await X.setKnownShards(Z)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await NJ(J)}catch(X){console.warn("Auto migration failed:",X)}}async function lJ(J,X){return await MJ(J),await X()}async function NJ(J){try{let{autoDetectAndMigrate:X}=await Promise.resolve().then(() => (m(),i)),Y=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${Y.length} shards for existing data...`);let Z=Y.map(async(W)=>{let H=J.shards[W];if(!H)return null;try{let V=await X(H,W,J,{maxRecordsToCheck:1000});return{shardName:W,...V}}catch(V){return console.warn(`Auto-migration failed for shard ${W}:`,V),null}}),$=(await Promise.all(Z)).filter((W)=>W?.migrationPerformed);if(J.debug)if($.length>0){let W=$.reduce((H,V)=>H+(V?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${W} records across ${$.length} shards`),$.forEach((H)=>{if(H)console.log(` ✅ ${H.shardName}: ${H.recordsMigrated} records from ${H.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch(X){console.warn("Background auto-migration setup failed:",X)}}function nJ(){y=null,h=null,u.clear()}function w(){if(!y)throw new _("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return y}function iJ(J){let X=J.trim().toUpperCase();if(X.startsWith("SELECT")||X.startsWith("VALUES")||X.startsWith("TABLE")||X.startsWith("PRAGMA")||X.startsWith("EXPLAIN")||X.startsWith("WITH")||X.startsWith("SHOW"))return"read";return"write"}function sJ(J,X){let Y=J.strategy||"hash";if(typeof Y==="string")return Y;let Z=Y;return Z[X]||Z.write||Z.read||"hash"}function tJ(J,X){if(J===X)return 0;let Y={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},Z=Y[J],G=Y[X],$=Z.lat-G.lat,W=Z.lon-G.lon;return Math.sqrt($*$+W*W)}function aJ(J){let X=J.cf;if(!X||!X.country)return"wnam";let{country:Y,continent:Z}=X;if(["US","CA","MX"].includes(Y)){let G=X.region||X.regionCode||"",$=X.timezone||"";if(G.includes("CA")||G.includes("WA")||G.includes("OR")||G.includes("NV")||G.includes("AZ")||G.includes("UT")||$.includes("Pacific")||$.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(Y))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(Y))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(Y))return"eeur";if(Y==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(Y))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(Y))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(Y))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(Y))return"me";if(Z==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(Y))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(Y))return"eeur";if(Z==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(Y))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(Y))return"enam";return"wnam"}function rJ(J){if(typeof J==="string")return J;return J.region||"wnam"}async function CJ(J){try{let[X,Y]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!X?.page_count||!Y?.page_size)throw new _("Failed to retrieve database size information","SIZE_QUERY_FAILED");return X.page_count*Y.page_size}catch(X){throw new _(`Failed to get database size: ${X instanceof Error?X.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function eJ(J,X){let Y=Math.max(0,X.sizeCacheTtlMs??30000),Z=u.get(J);if(Z&&Z.expiresAt>=Date.now())return Z.size;let G=X.shards[J];if(!G)throw new _(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let $=await CJ(G);if(Y>0)u.set(J,{size:$,expiresAt:Date.now()+Y});return $}async function JX(J,X){if(typeof X.maxDatabaseSize!=="number"||!Number.isFinite(X.maxDatabaseSize)||X.maxDatabaseSize<=0)return J;let Y=X.maxDatabaseSize,G=(await Promise.allSettled(J.map(async($)=>{let W=await eJ($,X);return{shard:$,size:W,withinLimit:W<Y}}))).filter(($)=>$.status==="fulfilled"&&$.value.withinLimit).map(($)=>$.value.shard);if(G.length===0){if(X.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if(X.debug&&G.length<J.length){let $=J.filter((W)=>!G.includes(W));console.log(`Excluded ${$.length} shards due to size limits: ${$.join(", ")}`)}return G}function XX(J,X,Y,Z){let G=X.filter((O)=>Y[O]);if(G.length===0){let O=0;for(let L=0;L<Z.length;L++){let j=Z.charCodeAt(L);O=(O<<5)-O+j,O=O&O}let F=Math.abs(O)%X.length;return X[F]}let $=G.map((O)=>{let F=Y[O],L=tJ(J,rJ(F)),j=typeof F==="object"?F.priority||1:1,E=L-j*0.1;return{shard:O,score:E,distance:L,priority:j}});$.sort((O,F)=>O.score-F.score);let W=$[0].score,H=$.filter((O)=>Math.abs(O.score-W)<0.01);if(H.length===1)return H[0].shard;let V=0;for(let O=0;O<Z.length;O++){let F=Z.charCodeAt(O);V=(V<<5)-V+F,V=V&V}let U=Math.abs(V)%H.length;return H[U].shard}function g(J,X,Y,Z){switch(J){case"hash":{let G=0;for(let W=0;W<X.length;W++){let H=X.charCodeAt(W);G=(G<<5)-G+H,G=G&G}let $=Math.abs(G)%Y.length;return Y[$]||Y[0]}case"location":{if(!Z.targetRegion)return g("hash",X,Y,Z);return XX(Z.targetRegion,Y,Z.shardLocations||{},X)}case"random":return Y[Math.floor(Math.random()*Y.length)]||Y[0];default:return g("hash",X,Y,Z)}}async function YX(J,X="write"){let Y=w(),Z=f(Y),G=await Z.getShardMapping(J);if(G)return G.shard;let $=Object.keys(Y.shards);if($.length===0)throw new _("No shards configured","NO_SHARDS");let W=await JX($,Y),H,V=sJ(Y,X);if(Y.coordinator)try{let U=Y.coordinator.idFromName("default"),F=await Y.coordinator.get(U).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:V,operationType:X,targetRegion:Y.targetRegion,shardLocations:Y.shardLocations,availableShards:W})});if(F.ok)H=(await F.json()).shard;else H=g(V,J,W,Y)}catch(U){console.warn("Coordinator allocation failed, falling back to local strategy:",U),H=g(V,J,W,Y)}else H=g(V,J,W,Y);return await Z.setShardMapping(J,H),H}async function ZX(J,X="write"){let Y=w(),Z=await YX(J,X),G=Y.shards[Z];if(!G)throw new _(`Shard ${Z} not found in configuration`,"SHARD_NOT_FOUND");return G}async function GX(J,X){let{createSchema:Y}=await Promise.resolve().then(() => (m(),i));await Y(J,X)}async function s(J,X){let Y=iJ(X);return(await ZX(J,Y)).prepare(X)}async function $X(J,X,Y=[]){let G=await(await s(J,X)).bind(...Y).run();if(!G.success)throw new _(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function WX(J,X,Y=[]){let G=await(await s(J,X)).bind(...Y).all();if(!G.success)throw new _(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function HX(J,X,Y=[]){return await(await s(J,X)).bind(...Y).first()}async function VX(J,X,Y){let Z=w();if(!Z.shards[X])throw new _(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");let G=f(Z),$=await G.getShardMapping(J);if(!$)throw new _(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if($.shard!==X){let{migrateRecord:W}=await Promise.resolve().then(() => (m(),i)),H=Z.shards[$.shard],V=Z.shards[X];if(!H||!V)throw new _("Source or target shard not available","SHARD_UNAVAILABLE");await W(H,V,J,Y)}await G.updateShardMapping(J,X)}async function UX(){let J=w();if(J.coordinator)try{let X=J.coordinator.idFromName("default"),Z=await J.coordinator.get(X).fetch("http://coordinator/shards");if(Z.ok)return await Z.json()}catch(X){console.warn("Failed to get shards from coordinator:",X)}try{let Y=await f(J).getKnownShards(),Z=new Set([...Object.keys(J.shards),...Y]);return Array.from(Z)}catch{return Object.keys(J.shards)}}async function OX(){let J=w();if(J.coordinator)try{let G=J.coordinator.idFromName("default"),W=await J.coordinator.get(G).fetch("http://coordinator/stats");if(W.ok)return await W.json()}catch(G){console.warn("Failed to get stats from coordinator:",G)}let X=f(J),Y=await X.getShardKeyCounts(),Z=Object.keys(J.shards);try{let G=await X.getKnownShards();Z=Array.from(new Set([...Z,...G]))}catch{}return Z.map((G)=>({binding:G,count:Y[G]||0}))}async function _X(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");let $=await G.prepare(X).bind(...Y).run();if(!$.success)throw new _(`Query failed: ${$.error||"Unknown error"}`,"QUERY_FAILED");return $}async function FX(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await G.prepare(X).bind(...Y).all()}async function LX(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await G.prepare(X).bind(...Y).first()}async function AX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).run().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),{success:!1,results:[],error:V instanceof Error?V.message:String(V),meta:{duration:0}}}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function IX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).all().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),{success:!1,results:[],error:V instanceof Error?V.message:String(V),meta:{duration:0}}}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function jX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).first().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),null}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function QX(){let J=w();if(await f(J).clearAllMappings(),u.clear(),J.coordinator)try{let Y=J.coordinator.idFromName("default");await J.coordinator.get(Y).fetch("http://coordinator/flush",{method:"POST"})}catch(Y){console.warn("Failed to flush coordinator:",Y)}}async function PX(J){let Y=w().shards[J];if(!Y)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await CJ(Y)}q();class $J{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let Y=new URL(J.url).pathname,Z=J.method;try{switch(`${Z} ${Y}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(G){return console.error("ShardCoordinator error:",G),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:X}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(!Y.knownShards.includes(X))Y.knownShards.push(X),Y.shardStats[X]={binding:X,count:0,lastUpdated:Date.now()},await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:X}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState(),Z=Y.knownShards.indexOf(X);if(Z>-1){if(Y.knownShards.splice(Z,1),delete Y.shardStats[X],Y.roundRobinIndex>=Y.knownShards.length)Y.roundRobinIndex=0;await this.saveState(Y)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),X=Object.values(J.shardStats);return new Response(JSON.stringify(X),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:X,count:Y}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(Y===void 0||typeof Y!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Z=await this.getState();if(Z.shardStats[X])Z.shardStats[X].count=Y,Z.shardStats[X].lastUpdated=Date.now(),await this.saveState(Z);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:X,strategy:Y,operationType:Z,availableShards:G}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let $=await this.getState(),W=G||$.knownShards;if(W.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let H=this.resolveStrategy($.strategy,Y,Z||"write"),V=this.selectShard(X,$,H,W);if(H==="round-robin")$.roundRobinIndex=($.roundRobinIndex+1)%W.length,await this.saveState($);return new Response(JSON.stringify({shard:V}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,X,Y="write"){if(X)return X;if(typeof J==="string")return J;return J[Y]}selectShard(J,X,Y,Z){let G=Z||X.knownShards;if(G.length===0)throw new _("No shards available","NO_SHARDS");switch(Y){case"round-robin":return G[X.roundRobinIndex]??G[0];case"random":return G[Math.floor(Math.random()*G.length)];case"hash":{let $=0;for(let H=0;H<J.length;H++){let V=J.charCodeAt(H);$=($<<5)-$+V,$=$&$}let W=Math.abs($)%G.length;return G[W]}case"location":{let $=X.targetRegion,W=X.shardLocations||{},H=G.filter((A)=>W[A]);if(!$||H.length===0){let A=0;for(let R=0;R<J.length;R++){let T=J.charCodeAt(R);A=(A<<5)-A+T,A=A&A}let I=Math.abs(A)%G.length;return G[I]}let V={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},U=(A,I)=>(I in A),O=(A)=>U(V,A)?A:"wnam",F=(A,I)=>{let R=V[O(A)],T=V[O(I)],P=R.lat-T.lat,Q=R.lon-T.lon;return Math.sqrt(P*P+Q*Q)},L=H.map((A)=>{let I=W[A],R=F($,I.region),T=I.priority||1;return{shard:A,score:R-T*0.1}});L.sort((A,I)=>A.score-I.score);let j=L[0].score,E=L.filter((A)=>Math.abs(A.score-j)<0.01);if(E.length===1)return E[0].shard;let z=0;for(let A=0;A<J.length;A++){let I=J.charCodeAt(A);z=(z<<5)-z+I,z=z&z}let M=Math.abs(z)%E.length;return E[M].shard}default:return G[0]}}async incrementShardCount(J){let X=await this.getState();if(X.shardStats[J])X.shardStats[J].count++,X.shardStats[J].lastUpdated=Date.now(),await this.saveState(X)}async decrementShardCount(J){let X=await this.getState();if(X.shardStats[J]&&X.shardStats[J].count>0)X.shardStats[J].count--,X.shardStats[J].lastUpdated=Date.now(),await this.saveState(X)}}if(typeof global<"u"){class J{data=new Map;async get(Z){return this.data.get(Z)}async put(Z,G){this.data.set(Z,G)}async delete(Z){return this.data.delete(Z)}async deleteAll(){this.data.clear()}async list(Z){if(!Z?.prefix)return new Map(this.data);let G=new Map;for(let[$,W]of this.data.entries())if($.startsWith(Z.prefix))G.set($,W);return G}}class X{storage;constructor(){this.storage=new J}}class Y{coordinator;mockState;constructor(){this.mockState=new X,this.coordinator=new $J(this.mockState)}async testShardAllocation(){await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-east"})})),await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-west"})}));let G=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"user-1",strategy:"round-robin"})}))).json(),W=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"user-2",strategy:"round-robin"})}))).json();console.assert(G.shard!==W.shard,"Round-robin should alternate shards");let V=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"consistent-key",strategy:"hash"})}))).json(),O=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"consistent-key",strategy:"hash"})}))).json();console.assert(V.shard===O.shard,"Hash allocation should be consistent"),console.log("✅ Shard allocation tests passed")}async testShardStats(){await this.coordinator.fetch(new Request("http://test/flush",{method:"POST"})),await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-stats-test"})})),await this.coordinator.fetch(new Request("http://test/stats",{method:"POST",body:JSON.stringify({shard:"db-stats-test",count:42})}));let G=await(await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"}))).json();console.assert(G.length===1,"Should have one shard stat"),console.assert(G[0]?.binding==="db-stats-test","Should have correct binding name"),console.assert(G[0]?.count===42,"Should have correct count"),console.log("✅ Shard stats tests passed")}async testErrorHandling(){await this.coordinator.fetch(new Request("http://test/flush",{method:"POST"}));let Z=await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"test-key"})}));console.assert(Z.status===400,"Should return 400 for no shards available");let G=await this.coordinator.fetch(new Request("http://test/invalid",{method:"GET"}));console.assert(G.status===404,"Should return 404 for invalid endpoint"),console.log("✅ Error handling tests passed")}async testCountManagement(){await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-count-test"})})),await this.coordinator.incrementShardCount("db-count-test"),await this.coordinator.incrementShardCount("db-count-test");let Z=await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"})),G=await Z.json(),$=G.find((H)=>H.binding==="db-count-test");console.assert($?.count===2,"Count should be 2 after two increments"),await this.coordinator.decrementShardCount("db-count-test"),Z=await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"})),G=await Z.json();let W=G.find((H)=>H.binding==="db-count-test");console.assert(W?.count===1,"Count should be 1 after decrement"),console.log("✅ Count management tests passed")}async runAllTests(){console.log("\uD83E\uDDEA Running ShardCoordinator tests...");try{return await this.testShardAllocation(),await this.testShardStats(),await this.testErrorHandling(),await this.testCountManagement(),console.log("\uD83C\uDF89 All ShardCoordinator tests passed!"),!0}catch(Z){return console.error("❌ ShardCoordinator tests failed:",Z),!1}}}globalThis.testShardCoordinator=()=>new Y}q();p();q();var EX=500;function SJ(J,X={}){let Y=X.scanCount??EX;return{async get(Z,G="text"){let $=await J.get(Z);if($===null)return null;if(G!=="json")return $;try{return JSON.parse($)}catch(W){throw new _(`Failed to parse JSON from Redis for key ${Z}: ${W instanceof Error?W.message:String(W)}`,"KV_JSON_PARSE_FAILED")}},async put(Z,G){await J.set(Z,G)},async delete(Z){await J.del(Z)},async list(Z){let G=Z?.prefix??"",$=`${G}*`,W=Z?.cursor??"0",H=Z?.limit,V=[];do{let U=await vX(J,W,$,Y);W=U.cursor;for(let O of U.keys){if(!G||O.startsWith(G))V.push(O);if(H&&V.length>=H)break}if(H&&V.length>=H)break}while(W!=="0");return{keys:V.map((U)=>({name:U})),cursor:W,list_complete:W==="0"}}}}function TX(J,X={}){return SJ(J,X)}function fJ(J,X){if(X)return a(J,X);return{prepare(Y){return new _J(J,Y)}}}function KJ(J,X){if(X)return a(J,X);return{prepare(Y){return new FJ(J,Y)}}}function RX(J,X){if(X)return a(J,X);return{prepare(Y){return new LJ(J,Y)}}}function a(J,X){return{prepare(Y){return new AJ(J,X,Y)}}}function zX(J){return{async get(X,Y="text"){let Z=await qX(J,X);if(Z===null||Z===void 0)return null;if(Y==="json"){if(typeof Z==="string")try{return JSON.parse(Z)}catch(G){throw new _(`Failed to parse JSON from NuxtHub KV for key ${X}: ${G instanceof Error?G.message:String(G)}`,"KV_JSON_PARSE_FAILED")}return Z}return typeof Z==="string"?Z:JSON.stringify(Z)},async put(X,Y){await kX(J,X,Y)},async delete(X){await SX(J,X)},async list(X){let Y=X?.prefix??"",Z=await fX(J,Y);return{keys:(typeof X?.limit==="number"?Z.slice(0,X.limit):Z).map(($)=>({name:$})),list_complete:!0}}}}function DX(J,X){return fJ({query:async(Z,G=[])=>{let $=X(J.connectionString);if(typeof $.connect==="function")await $.connect();try{return await $.query(Z,G)}finally{if(typeof $.release==="function")$.release();else if(typeof $.end==="function")await $.end()}}})}function wX(J,X){return KJ({execute:async(Z,G=[])=>{let $=X(J.connectionString);try{if(typeof $.execute==="function")return await $.execute(Z,G);if(typeof $.query==="function")return await $.query(Z,G);throw new _("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof $.end==="function")await $.end();else if(typeof $.close==="function")await $.close();else if(typeof $.destroy==="function")$.destroy()}}})}function BX(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function xX(J){if(!J||typeof J!=="object")return!1;let X=J;return typeof X.get==="function"&&typeof X.put==="function"&&typeof X.delete==="function"&&typeof X.list==="function"}class _J{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new _J(this.client,this.sql,J)}async run(){let J=Date.now(),X=OJ(this.sql),Y=await this.client.query(X,this.bindings);return{success:!0,results:Y.rows??[],meta:v(J,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async all(){let J=Date.now(),X=OJ(this.sql),Y=await this.client.query(X,this.bindings);return{success:!0,results:Y.rows??[],meta:v(J,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async first(){let J=OJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class FJ{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new FJ(this.client,this.sql,J)}async run(){let J=Date.now(),X=await WJ(this.client,this.sql,this.bindings);if(Array.isArray(X))return{success:!0,results:X,meta:v(J)};let Y=X;return{success:!0,results:[],meta:v(J,{changes:Y.affectedRows,last_row_id:Y.insertId,warningStatus:Y.warningStatus})}}async all(){let J=Date.now(),X=await WJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray(X)?X:[],meta:v(J,{changes:!Array.isArray(X)?X.affectedRows:void 0})}}async first(){let J=await WJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class LJ{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new LJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let G=await this.client.execute(this.sql,this.bindings);return{success:!0,results:UJ(G),meta:v(J)}}let X=this.client.prepare?.(this.sql);if(!X||typeof X.run!=="function")throw new _("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Z=await X.run(...this.bindings)??{};return{success:!0,results:[],meta:v(J,{changes:t(Z.changes),last_row_id:Z.lastInsertRowid??Z.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:UJ(Z),meta:v(J)}}let X=this.client.prepare?.(this.sql);if(!X||typeof X.all!=="function")throw new _("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let Y=await X.all(...this.bindings);return{success:!0,results:Array.isArray(Y)?Y:[],meta:v(J)}}async first(){if(typeof this.client.execute==="function"){let X=await this.client.execute(this.sql,this.bindings);return UJ(X)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new _("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let X=await J.get(...this.bindings);return X===void 0||X===null?null:X}if(typeof J.all==="function"){let X=await J.all(...this.bindings);if(!Array.isArray(X)||X.length===0)return null;let Y=X[0];return Y===void 0||Y===null?null:Y}throw new _("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class AJ{client;sqlTag;sqlText;bindings;constructor(J,X,Y,Z=[]){this.client=J,this.sqlTag=X,this.sqlText=Y,this.bindings=Z}bind(...J){return new AJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),X=HJ(this.sqlTag,this.sqlText,this.bindings),Y=await MX(this.client,X);return{success:!0,results:VJ(Y),meta:v(J,kJ(Y))}}async all(){let J=Date.now(),X=HJ(this.sqlTag,this.sqlText,this.bindings),Y=await bJ(this.client,X);return{success:!0,results:VJ(Y),meta:v(J,kJ(Y))}}async first(){let J=HJ(this.sqlTag,this.sqlText,this.bindings),X=await NX(this.client,J),Y=VJ(X);if(Y.length>0)return Y[0]??null;if(X&&typeof X==="object"&&"row"in X){let Z=X.row;return Z===void 0||Z===null?null:Z}if(X&&typeof X==="object"&&!Array.isArray(X)&&!("rows"in X)&&!("results"in X)&&!("data"in X))return X;return null}}async function vX(J,X,Y,Z){try{let G=await J.scan(X,{MATCH:Y,COUNT:Z});return qJ(G)}catch{let G=await J.scan(X,"MATCH",Y,"COUNT",String(Z));return qJ(G)}}function qJ(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function WJ(J,X,Y){if(typeof J.execute==="function"){let[Z]=await J.execute(X,Y);return Z}if(typeof J.query==="function"){let[Z]=await J.query(X,Y);return Z}throw new _("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function MX(J,X){if(typeof J.run==="function")return await J.run(X);if(typeof J.execute==="function")return await J.execute(X);if(typeof J.all==="function")return await J.all(X);throw new _("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function bJ(J,X){if(typeof J.all==="function")return await J.all(X);if(typeof J.execute==="function")return await J.execute(X);if(typeof J.run==="function")return await J.run(X);throw new _("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function NX(J,X){if(typeof J.get==="function")return await J.get(X);return await bJ(J,X)}function HJ(J,X,Y){let Z=CX(X),G=Z.length-1;if(G!==Y.length)throw new _(`Drizzle binding mismatch: expected ${G} bindings, received ${Y.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(G===0)return J.raw(X);let $=typeof J.empty==="function"?J.empty():J.raw("");for(let W=0;W<Z.length;W++){let H=Z[W];if(H)$.append(J.raw(H));if(W<G)$.append(J`${Y[W]}`)}return $}function CX(J){let X=[],Y=0,Z=!1,G=!1,$=!1,W=!1;for(let H=0;H<J.length;H++){let V=J[H],U=H+1<J.length?J[H+1]:"";if($){if(V===`
17
- `)$=!1;continue}if(W){if(V==="*"&&U==="/")H++,W=!1;continue}if(!Z&&!G){if(V==="-"&&U==="-"){H++,$=!0;continue}if(V==="/"&&U==="*"){H++,W=!0;continue}}if(V==="'"&&!G){if(Z&&U==="'"){H++;continue}Z=!Z;continue}if(V==='"'&&!Z){if(G&&U==='"'){H++;continue}G=!G;continue}if(V==="?"&&!Z&&!G)X.push(J.slice(Y,H)),Y=H+1}return X.push(J.slice(Y)),X}function VJ(J){if(Array.isArray(J)){if(J.length===2&&Array.isArray(J[0]))return J[0];if(J.length===2&&J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0])&&(Array.isArray(J[1])||J[1]===null||J[1]===void 0))return[];return J}if(J&&typeof J==="object"){let X=J;if(Array.isArray(X.rows))return X.rows;if(Array.isArray(X.results))return X.results;if(Array.isArray(X.data))return X.data}return[]}function kJ(J){if(!J)return{};let X;if(Array.isArray(J)&&J.length===2&&J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0]))X=J[0];else if(typeof J==="object"&&!Array.isArray(J))X=J;if(!X)return{};let Y={},Z=t(X.rowCount)??t(X.changes)??t(X.affectedRows);if(Z!==void 0)Y.changes=Z;let G=X.lastInsertRowid??X.lastInsertId??X.insertId;if(typeof G==="number"||typeof G==="string")Y.last_row_id=G;if(X.meta&&typeof X.meta==="object")Object.assign(Y,X.meta);return Y}async function qX(J,X){if(typeof J.get==="function")return await J.get(X);if(typeof J.getItem==="function")return await J.getItem(X);throw new _("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function kX(J,X,Y){if(typeof J.set==="function"){await J.set(X,Y);return}if(typeof J.setItem==="function"){await J.setItem(X,Y);return}throw new _("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function SX(J,X){if(typeof J.del==="function"){await J.del(X);return}if(typeof J.removeItem==="function"){await J.removeItem(X);return}throw new _("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function fX(J,X){let Y;if(typeof J.keys==="function")Y=await J.keys(X);else if(typeof J.getKeys==="function")Y=await J.getKeys(X);else throw new _("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(Y))return[];if(!X)return Y;return Y.filter((Z)=>Z.startsWith(X))}function UJ(J){if(Array.isArray(J))return J;if(J&&typeof J==="object"){let X=J;if(Array.isArray(X.rows))return X.rows;if(Array.isArray(X.results))return X.results}return[]}function v(J,X={}){return{duration:Date.now()-J,...X}}function t(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var c=new Map;function OJ(J){let X=c.get(J);if(X)return X;let Y="",Z=0,G=!1,$=!1,W=!1,H=!1;for(let V=0;V<J.length;V++){let U=J[V],O=V+1<J.length?J[V+1]:"";if(W){if(Y+=U,U===`
16
+ `).run()}if(S.set(F,!0),M&&Y.debug)console.log(`Auto-migration completed for shard ${X}: ${j} records from ${E} tables`)}catch(A){L.push(`Auto-migration error: ${A}`)}return{migrationNeeded:z,migrationPerformed:M,recordsMigrated:j,tablesProcessed:E,issues:L}}async function BJ(J,X,Y){let Z=`${X}_migration_check`;if(S.has(Z))return!1;try{let G=await b(J);if(G.includes("shard_mappings"))return S.set(Z,!0),!1;let{KVShardMapper:W}=await Promise.resolve().then(() => (p(),XJ)),H=new W(Y.kv,{hashShardMappings:Y.hashShardMappings,mappingCacheTtlMs:Y.mappingCacheTtlMs,knownShardsCacheTtlMs:Y.knownShardsCacheTtlMs}),V=G.filter((U)=>U!=="shard_mappings"&&!U.startsWith("sqlite_")&&U!=="sqlite_sequence");for(let U of V.slice(0,3))try{if(((await J.prepare(`SELECT COUNT(*) as count FROM ${U} LIMIT 1`).first())?.count||0)>0){let L=await J.prepare(`SELECT id FROM ${U} LIMIT 1`).first();if(L){let j=String(L.id);if(!await H.getShardMapping(j))return!0}}}catch{continue}return!1}catch{return!1}}function xJ(){S.clear()}function vJ(J){let X=`${J}_migration_check`;S.delete(X)}var S,YJ;var m=JJ(()=>{q();S=new Map,YJ=new Map});q();p();var y=null,h=null,u=new Map;function f(J){if(!h)h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs});return h}function oJ(J){y=J,h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),u.clear();try{let X=f(J);Promise.resolve().then(async()=>{let Y=await X.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(J.shards)]));await X.setKnownShards(Z)}).catch(()=>{return})}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)NJ(J).catch((X)=>{console.warn("Background auto-migration failed:",X)})}async function MJ(J){y=J,h=new k(J.kv,{hashShardMappings:J.hashShardMappings,mappingCacheTtlMs:J.mappingCacheTtlMs,knownShardsCacheTtlMs:J.knownShardsCacheTtlMs}),u.clear();try{let X=f(J),Y=await X.getKnownShards(),Z=Array.from(new Set([...Y,...Object.keys(J.shards)]));await X.setKnownShards(Z)}catch{}if(J.shards&&Object.keys(J.shards).length>0&&!J.disableAutoMigration)try{await NJ(J)}catch(X){console.warn("Auto migration failed:",X)}}async function lJ(J,X){return await MJ(J),await X()}async function NJ(J){try{let{autoDetectAndMigrate:X}=await Promise.resolve().then(() => (m(),i)),Y=Object.keys(J.shards);if(J.debug)console.log(`\uD83D\uDD0D Checking ${Y.length} shards for existing data...`);let Z=Y.map(async(W)=>{let H=J.shards[W];if(!H)return null;try{let V=await X(H,W,J,{maxRecordsToCheck:1000});return{shardName:W,...V}}catch(V){return console.warn(`Auto-migration failed for shard ${W}:`,V),null}}),$=(await Promise.all(Z)).filter((W)=>W?.migrationPerformed);if(J.debug)if($.length>0){let W=$.reduce((H,V)=>H+(V?.recordsMigrated||0),0);console.log(`\uD83C\uDF89 Auto-migration completed! Migrated ${W} records across ${$.length} shards`),$.forEach((H)=>{if(H)console.log(` ✅ ${H.shardName}: ${H.recordsMigrated} records from ${H.tablesProcessed} tables`)})}else console.log("✅ All shards ready - no migration needed")}catch(X){console.warn("Background auto-migration setup failed:",X)}}function nJ(){y=null,h=null,u.clear()}function w(){if(!y)throw new _("CollegeDB not initialized. Call initialize() first.","NOT_INITIALIZED");return y}function iJ(J){let X=J.trim().toUpperCase();if(X.startsWith("SELECT")||X.startsWith("VALUES")||X.startsWith("TABLE")||X.startsWith("PRAGMA")||X.startsWith("EXPLAIN")||X.startsWith("WITH")||X.startsWith("SHOW"))return"read";return"write"}function sJ(J,X){let Y=J.strategy||"hash";if(typeof Y==="string")return Y;let Z=Y;return Z[X]||Z.write||Z.read||"hash"}function tJ(J,X){if(J===X)return 0;let Y={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7128,lon:-74.006},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.52,lon:13.405},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},Z=Y[J],G=Y[X],$=Z.lat-G.lat,W=Z.lon-G.lon;return Math.sqrt($*$+W*W)}function aJ(J){let X=J.cf;if(!X||!X.country)return"wnam";let{country:Y,continent:Z}=X;if(["US","CA","MX"].includes(Y)){let G=X.region||X.regionCode||"",$=X.timezone||"";if(G.includes("CA")||G.includes("WA")||G.includes("OR")||G.includes("NV")||G.includes("AZ")||G.includes("UT")||$.includes("Pacific")||$.includes("America/Los_Angeles"))return"wnam";return"enam"}if(["GL","PM","BM"].includes(Y))return"enam";if(["GB","IE","FR","ES","PT","NL","BE","LU","CH","AT","IT"].includes(Y))return"weur";if(["DE","PL","CZ","SK","HU","SI","HR","BA","RS","ME","MK","AL","BG","RO","MD","UA","BY","LT","LV","EE","FI","SE","NO","DK","IS"].includes(Y))return"eeur";if(Y==="RU")return"eeur";if(["JP","KR","CN","HK","TW","MO","MN","KP"].includes(Y))return"apac";if(["TH","VN","SG","MY","ID","PH","BN","KH","LA","MM","TL","IN","PK","BD","LK","NP","BT","MV","AF"].includes(Y))return"apac";if(["AU","NZ","PG","FJ","NC","VU","SB","WS","TO","KI","NR","PW","FM","MH","TV"].includes(Y))return"oc";if(["AE","SA","QA","KW","BH","OM","YE","IQ","IR","SY","LB","JO","IL","PS","TR","CY"].includes(Y))return"me";if(Z==="AF"||["EG","LY","TN","DZ","MA","SD","SS","ET","ER","DJ","SO"].includes(Y))return"af";if(["KZ","UZ","TM","TJ","KG"].includes(Y))return"eeur";if(Z==="SA"||["BR","AR","CL","PE","CO","VE","EC","BO","PY","UY","GY","SR","GF"].includes(Y))return"enam";if(["GT","BZ","SV","HN","NI","CR","PA","CU","JM","HT","DO","PR","TT","BB","GD","VC","LC","DM","AG","KN"].includes(Y))return"enam";return"wnam"}function rJ(J){if(typeof J==="string")return J;return J.region||"wnam"}async function CJ(J){try{let[X,Y]=await Promise.all([J.prepare("PRAGMA page_count").first(),J.prepare("PRAGMA page_size").first()]);if(!X?.page_count||!Y?.page_size)throw new _("Failed to retrieve database size information","SIZE_QUERY_FAILED");return X.page_count*Y.page_size}catch(X){throw new _(`Failed to get database size: ${X instanceof Error?X.message:"Unknown error"}`,"SIZE_QUERY_FAILED")}}async function eJ(J,X){let Y=Math.max(0,X.sizeCacheTtlMs??30000),Z=u.get(J);if(Z&&Z.expiresAt>=Date.now())return Z.size;let G=X.shards[J];if(!G)throw new _(`Shard ${J} not found in configuration`,"SHARD_NOT_FOUND");let $=await CJ(G);if(Y>0)u.set(J,{size:$,expiresAt:Date.now()+Y});return $}async function JX(J,X){if(typeof X.maxDatabaseSize!=="number"||!Number.isFinite(X.maxDatabaseSize)||X.maxDatabaseSize<=0)return J;let Y=X.maxDatabaseSize,G=(await Promise.allSettled(J.map(async($)=>{let W=await eJ($,X);return{shard:$,size:W,withinLimit:W<Y}}))).filter(($)=>$.status==="fulfilled"&&$.value.withinLimit).map(($)=>$.value.shard);if(G.length===0){if(X.debug)console.warn("All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.");return J}if(X.debug&&G.length<J.length){let $=J.filter((W)=>!G.includes(W));console.log(`Excluded ${$.length} shards due to size limits: ${$.join(", ")}`)}return G}function XX(J,X,Y,Z){let G=X.filter((O)=>Y[O]);if(G.length===0){let O=0;for(let L=0;L<Z.length;L++){let j=Z.charCodeAt(L);O=(O<<5)-O+j,O=O&O}let F=Math.abs(O)%X.length;return X[F]}let $=G.map((O)=>{let F=Y[O],L=tJ(J,rJ(F)),j=typeof F==="object"?F.priority||1:1,E=L-j*0.1;return{shard:O,score:E,distance:L,priority:j}});$.sort((O,F)=>O.score-F.score);let W=$[0].score,H=$.filter((O)=>Math.abs(O.score-W)<0.01);if(H.length===1)return H[0].shard;let V=0;for(let O=0;O<Z.length;O++){let F=Z.charCodeAt(O);V=(V<<5)-V+F,V=V&V}let U=Math.abs(V)%H.length;return H[U].shard}function g(J,X,Y,Z){switch(J){case"hash":{let G=0;for(let W=0;W<X.length;W++){let H=X.charCodeAt(W);G=(G<<5)-G+H,G=G&G}let $=Math.abs(G)%Y.length;return Y[$]||Y[0]}case"location":{if(!Z.targetRegion)return g("hash",X,Y,Z);return XX(Z.targetRegion,Y,Z.shardLocations||{},X)}case"random":return Y[Math.floor(Math.random()*Y.length)]||Y[0];default:return g("hash",X,Y,Z)}}async function YX(J,X="write"){let Y=w(),Z=f(Y),G=await Z.getShardMapping(J);if(G)return G.shard;let $=Object.keys(Y.shards);if($.length===0)throw new _("No shards configured","NO_SHARDS");let W=await JX($,Y),H,V=sJ(Y,X);if(Y.coordinator)try{let U=Y.coordinator.idFromName("default"),F=await Y.coordinator.get(U).fetch("http://coordinator/allocate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({primaryKey:J,strategy:V,operationType:X,targetRegion:Y.targetRegion,shardLocations:Y.shardLocations,availableShards:W})});if(F.ok)H=(await F.json()).shard;else H=g(V,J,W,Y)}catch(U){console.warn("Coordinator allocation failed, falling back to local strategy:",U),H=g(V,J,W,Y)}else H=g(V,J,W,Y);return await Z.setShardMapping(J,H),H}async function ZX(J,X="write"){let Y=w(),Z=await YX(J,X),G=Y.shards[Z];if(!G)throw new _(`Shard ${Z} not found in configuration`,"SHARD_NOT_FOUND");return G}async function GX(J,X){let{createSchema:Y}=await Promise.resolve().then(() => (m(),i));await Y(J,X)}async function s(J,X){let Y=iJ(X);return(await ZX(J,Y)).prepare(X)}async function $X(J,X,Y=[]){let G=await(await s(J,X)).bind(...Y).run();if(!G.success)throw new _(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function WX(J,X,Y=[]){let G=await(await s(J,X)).bind(...Y).all();if(!G.success)throw new _(`Query failed: ${G.error||"Unknown error"}`,"QUERY_FAILED");return G}async function HX(J,X,Y=[]){return await(await s(J,X)).bind(...Y).first()}async function VX(J,X,Y){let Z=w();if(!Z.shards[X])throw new _(`Shard ${X} not found in configuration`,"SHARD_NOT_FOUND");let G=f(Z),$=await G.getShardMapping(J);if(!$)throw new _(`No existing mapping found for primary key: ${J}`,"MAPPING_NOT_FOUND");if($.shard!==X){let{migrateRecord:W}=await Promise.resolve().then(() => (m(),i)),H=Z.shards[$.shard],V=Z.shards[X];if(!H||!V)throw new _("Source or target shard not available","SHARD_UNAVAILABLE");await W(H,V,J,Y)}await G.updateShardMapping(J,X)}async function UX(){let J=w();if(J.coordinator)try{let X=J.coordinator.idFromName("default"),Z=await J.coordinator.get(X).fetch("http://coordinator/shards");if(Z.ok)return await Z.json()}catch(X){console.warn("Failed to get shards from coordinator:",X)}try{let Y=await f(J).getKnownShards(),Z=new Set([...Object.keys(J.shards),...Y]);return Array.from(Z)}catch{return Object.keys(J.shards)}}async function OX(){let J=w();if(J.coordinator)try{let G=J.coordinator.idFromName("default"),W=await J.coordinator.get(G).fetch("http://coordinator/stats");if(W.ok)return await W.json()}catch(G){console.warn("Failed to get stats from coordinator:",G)}let X=f(J),Y=await X.getShardKeyCounts(),Z=Object.keys(J.shards);try{let G=await X.getKnownShards();Z=Array.from(new Set([...Z,...G]))}catch{}return Z.map((G)=>({binding:G,count:Y[G]||0}))}async function _X(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");let $=await G.prepare(X).bind(...Y).run();if(!$.success)throw new _(`Query failed: ${$.error||"Unknown error"}`,"QUERY_FAILED");return $}async function FX(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await G.prepare(X).bind(...Y).all()}async function LX(J,X,Y=[]){let G=w().shards[J];if(!G)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await G.prepare(X).bind(...Y).first()}async function AX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).run().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),{success:!1,results:[],error:V instanceof Error?V.message:String(V),meta:{duration:0}}}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function IX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).all().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),{success:!1,results:[],error:V instanceof Error?V.message:String(V),meta:{duration:0}}}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function jX(J,X=[],Y=50){let Z=w(),G=[];for(let[W,H]of Object.entries(Z.shards)){if(!W||!H){console.error(`Shard ${W??"<null>"} not found, skipping`);continue}G.push(()=>H.prepare(J).bind(...X).first().catch((V)=>{return console.error(`Error executing query on shard ${W}:`,V),null}))}let $=[];for(let W=0;W<G.length;W+=Y){let H=G.slice(W,W+Y).map((V)=>V());$.push(...await Promise.all(H))}return $}async function QX(){let J=w();if(await f(J).clearAllMappings(),u.clear(),J.coordinator)try{let Y=J.coordinator.idFromName("default");await J.coordinator.get(Y).fetch("http://coordinator/flush",{method:"POST"})}catch(Y){console.warn("Failed to flush coordinator:",Y)}}async function PX(J){let Y=w().shards[J];if(!Y)throw new _(`Shard ${J} not found`,"SHARD_NOT_FOUND");return await CJ(Y)}q();class $J{state;constructor(J){this.state=J}async getState(){return await this.state.storage.get("coordinator_state")||{knownShards:[],shardStats:{},strategy:"round-robin",roundRobinIndex:0}}async saveState(J){await this.state.storage.put("coordinator_state",J)}async fetch(J){let Y=new URL(J.url).pathname,Z=J.method;try{switch(`${Z} ${Y}`){case"GET /shards":return this.handleListShards();case"POST /shards":return this.handleAddShard(J);case"DELETE /shards":return this.handleRemoveShard(J);case"GET /stats":return this.handleGetStats();case"POST /stats":return this.handleUpdateStats(J);case"POST /allocate":return this.handleAllocateShard(J);case"POST /flush":return this.handleFlush();case"GET /health":return new Response("OK",{status:200});default:return new Response("Not Found",{status:404})}}catch(G){return console.error("ShardCoordinator error:",G),new Response("Internal Server Error",{status:500})}}async handleListShards(){let J=await this.getState();return new Response(JSON.stringify(J.knownShards),{headers:{"Content-Type":"application/json"}})}async handleAddShard(J){let{shard:X}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState();if(!Y.knownShards.includes(X))Y.knownShards.push(X),Y.shardStats[X]={binding:X,count:0,lastUpdated:Date.now()},await this.saveState(Y);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleRemoveShard(J){let{shard:X}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Y=await this.getState(),Z=Y.knownShards.indexOf(X);if(Z>-1){if(Y.knownShards.splice(Z,1),delete Y.shardStats[X],Y.roundRobinIndex>=Y.knownShards.length)Y.roundRobinIndex=0;await this.saveState(Y)}return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleGetStats(){let J=await this.getState(),X=Object.values(J.shardStats);return new Response(JSON.stringify(X),{headers:{"Content-Type":"application/json"}})}async handleUpdateStats(J){let{shard:X,count:Y}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid shard parameter"}),{status:400,headers:{"Content-Type":"application/json"}});if(Y===void 0||typeof Y!=="number")return new Response(JSON.stringify({error:"Missing or invalid count parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let Z=await this.getState();if(Z.shardStats[X])Z.shardStats[X].count=Y,Z.shardStats[X].lastUpdated=Date.now(),await this.saveState(Z);return new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}async handleAllocateShard(J){let{primaryKey:X,strategy:Y,operationType:Z,availableShards:G}=await J.json();if(!X||typeof X!=="string")return new Response(JSON.stringify({error:"Missing or invalid primaryKey parameter"}),{status:400,headers:{"Content-Type":"application/json"}});let $=await this.getState(),W=G||$.knownShards;if(W.length===0)return new Response(JSON.stringify({error:"No shards available"}),{status:400,headers:{"Content-Type":"application/json"}});let H=this.resolveStrategy($.strategy,Y,Z||"write"),V=this.selectShard(X,$,H,W);if(H==="round-robin")$.roundRobinIndex=($.roundRobinIndex+1)%W.length,await this.saveState($);return new Response(JSON.stringify({shard:V}),{headers:{"Content-Type":"application/json"}})}async handleFlush(){return await this.state.storage.deleteAll(),new Response(JSON.stringify({success:!0}),{headers:{"Content-Type":"application/json"}})}resolveStrategy(J,X,Y="write"){if(X)return X;if(typeof J==="string")return J;return J[Y]}selectShard(J,X,Y,Z){let G=Z||X.knownShards;if(G.length===0)throw new _("No shards available","NO_SHARDS");switch(Y){case"round-robin":return G[X.roundRobinIndex]??G[0];case"random":return G[Math.floor(Math.random()*G.length)];case"hash":{let $=0;for(let H=0;H<J.length;H++){let V=J.charCodeAt(H);$=($<<5)-$+V,$=$&$}let W=Math.abs($)%G.length;return G[W]}case"location":{let $=X.targetRegion,W=X.shardLocations||{},H=G.filter((A)=>W[A]);if(!$||H.length===0){let A=0;for(let R=0;R<J.length;R++){let T=J.charCodeAt(R);A=(A<<5)-A+T,A=A&A}let I=Math.abs(A)%G.length;return G[I]}let V={wnam:{lat:37.7749,lon:-122.4194},enam:{lat:40.7357,lon:-74.1724},weur:{lat:51.5074,lon:-0.1278},eeur:{lat:52.2297,lon:21.0122},apac:{lat:35.6762,lon:139.6503},oc:{lat:-33.8688,lon:151.2093},me:{lat:25.2048,lon:55.2708},af:{lat:-26.2041,lon:28.0473}},U=(A,I)=>(I in A),O=(A)=>U(V,A)?A:"wnam",F=(A,I)=>{let R=V[O(A)],T=V[O(I)],P=R.lat-T.lat,Q=R.lon-T.lon;return Math.sqrt(P*P+Q*Q)},L=H.map((A)=>{let I=W[A],R=F($,I.region),T=I.priority||1;return{shard:A,score:R-T*0.1}});L.sort((A,I)=>A.score-I.score);let j=L[0].score,E=L.filter((A)=>Math.abs(A.score-j)<0.01);if(E.length===1)return E[0].shard;let z=0;for(let A=0;A<J.length;A++){let I=J.charCodeAt(A);z=(z<<5)-z+I,z=z&z}let M=Math.abs(z)%E.length;return E[M].shard}default:return G[0]}}async incrementShardCount(J){let X=await this.getState();if(X.shardStats[J])X.shardStats[J].count++,X.shardStats[J].lastUpdated=Date.now(),await this.saveState(X)}async decrementShardCount(J){let X=await this.getState();if(X.shardStats[J]&&X.shardStats[J].count>0)X.shardStats[J].count--,X.shardStats[J].lastUpdated=Date.now(),await this.saveState(X)}}if(typeof global<"u"){class J{data=new Map;async get(Z){return this.data.get(Z)}async put(Z,G){this.data.set(Z,G)}async delete(Z){return this.data.delete(Z)}async deleteAll(){this.data.clear()}async list(Z){if(!Z?.prefix)return new Map(this.data);let G=new Map;for(let[$,W]of this.data.entries())if($.startsWith(Z.prefix))G.set($,W);return G}}class X{storage;constructor(){this.storage=new J}}class Y{coordinator;mockState;constructor(){this.mockState=new X,this.coordinator=new $J(this.mockState)}async testShardAllocation(){await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-east"})})),await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-west"})}));let G=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"user-1",strategy:"round-robin"})}))).json(),W=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"user-2",strategy:"round-robin"})}))).json();console.assert(G.shard!==W.shard,"Round-robin should alternate shards");let V=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"consistent-key",strategy:"hash"})}))).json(),O=await(await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"consistent-key",strategy:"hash"})}))).json();console.assert(V.shard===O.shard,"Hash allocation should be consistent"),console.log("✅ Shard allocation tests passed")}async testShardStats(){await this.coordinator.fetch(new Request("http://test/flush",{method:"POST"})),await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-stats-test"})})),await this.coordinator.fetch(new Request("http://test/stats",{method:"POST",body:JSON.stringify({shard:"db-stats-test",count:42})}));let G=await(await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"}))).json();console.assert(G.length===1,"Should have one shard stat"),console.assert(G[0]?.binding==="db-stats-test","Should have correct binding name"),console.assert(G[0]?.count===42,"Should have correct count"),console.log("✅ Shard stats tests passed")}async testErrorHandling(){await this.coordinator.fetch(new Request("http://test/flush",{method:"POST"}));let Z=await this.coordinator.fetch(new Request("http://test/allocate",{method:"POST",body:JSON.stringify({primaryKey:"test-key"})}));console.assert(Z.status===400,"Should return 400 for no shards available");let G=await this.coordinator.fetch(new Request("http://test/invalid",{method:"GET"}));console.assert(G.status===404,"Should return 404 for invalid endpoint"),console.log("✅ Error handling tests passed")}async testCountManagement(){await this.coordinator.fetch(new Request("http://test/shards",{method:"POST",body:JSON.stringify({shard:"db-count-test"})})),await this.coordinator.incrementShardCount("db-count-test"),await this.coordinator.incrementShardCount("db-count-test");let Z=await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"})),G=await Z.json(),$=G.find((H)=>H.binding==="db-count-test");console.assert($?.count===2,"Count should be 2 after two increments"),await this.coordinator.decrementShardCount("db-count-test"),Z=await this.coordinator.fetch(new Request("http://test/stats",{method:"GET"})),G=await Z.json();let W=G.find((H)=>H.binding==="db-count-test");console.assert(W?.count===1,"Count should be 1 after decrement"),console.log("✅ Count management tests passed")}async runAllTests(){console.log("\uD83E\uDDEA Running ShardCoordinator tests...");try{return await this.testShardAllocation(),await this.testShardStats(),await this.testErrorHandling(),await this.testCountManagement(),console.log("\uD83C\uDF89 All ShardCoordinator tests passed!"),!0}catch(Z){return console.error("❌ ShardCoordinator tests failed:",Z),!1}}}globalThis.testShardCoordinator=()=>new Y}q();p();q();var EX=500;function SJ(J,X={}){let Y=X.scanCount??EX;return{async get(Z,G="text"){let $=await J.get(Z);if($===null)return null;if(G!=="json")return $;try{return JSON.parse($)}catch(W){throw new _(`Failed to parse JSON from Redis for key ${Z}: ${W instanceof Error?W.message:String(W)}`,"KV_JSON_PARSE_FAILED")}},async put(Z,G){await J.set(Z,G)},async delete(Z){await J.del(Z)},async list(Z){let G=Z?.prefix??"",$=`${G}*`,W=Z?.cursor??"0",H=Z?.limit,V=[];do{let U=await vX(J,W,$,Y);W=U.cursor;for(let O of U.keys){if(!G||O.startsWith(G))V.push(O);if(H&&V.length>=H)break}if(H&&V.length>=H)break}while(W!=="0");return{keys:V.map((U)=>({name:U})),cursor:W,list_complete:W==="0"}}}}function TX(J,X={}){return SJ(J,X)}function fJ(J,X){if(X)return a(J,X);return{prepare(Y){return new _J(J,Y)}}}function KJ(J,X){if(X)return a(J,X);return{prepare(Y){return new FJ(J,Y)}}}function RX(J,X){if(X)return a(J,X);return{prepare(Y){return new LJ(J,Y)}}}function a(J,X){return{prepare(Y){return new AJ(J,X,Y)}}}function zX(J){return{async get(X,Y="text"){let Z=await qX(J,X);if(Z===null||Z===void 0)return null;if(Y==="json"){if(typeof Z==="string")try{return JSON.parse(Z)}catch(G){throw new _(`Failed to parse JSON from NuxtHub KV for key ${X}: ${G instanceof Error?G.message:String(G)}`,"KV_JSON_PARSE_FAILED")}return Z}return typeof Z==="string"?Z:JSON.stringify(Z)},async put(X,Y){await kX(J,X,Y)},async delete(X){await SX(J,X)},async list(X){let Y=X?.prefix??"",Z=await fX(J,Y);return{keys:(typeof X?.limit==="number"?Z.slice(0,X.limit):Z).map(($)=>({name:$})),list_complete:!0}}}}function DX(J,X){return fJ({query:async(Z,G=[])=>{let $=X(J.connectionString);if(typeof $.connect==="function")await $.connect();try{return await $.query(Z,G)}finally{if(typeof $.release==="function")$.release();else if(typeof $.end==="function")await $.end()}}})}function wX(J,X){return KJ({execute:async(Z,G=[])=>{let $=X(J.connectionString);try{if(typeof $.execute==="function")return await $.execute(Z,G);if(typeof $.query==="function")return await $.query(Z,G);throw new _("Hyperdrive MySQL client is missing execute/query methods","MYSQL_CLIENT_INVALID")}finally{if(typeof $.end==="function")await $.end();else if(typeof $.close==="function")await $.close();else if(typeof $.destroy==="function")$.destroy()}}})}function BX(J){if(!J||typeof J!=="object")return!1;return typeof J.prepare==="function"}function xX(J){if(!J||typeof J!=="object")return!1;let X=J;return typeof X.get==="function"&&typeof X.put==="function"&&typeof X.delete==="function"&&typeof X.list==="function"}class _J{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new _J(this.client,this.sql,J)}async run(){let J=Date.now(),X=OJ(this.sql),Y=await this.client.query(X,this.bindings);return{success:!0,results:Y.rows??[],meta:v(J,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async all(){let J=Date.now(),X=OJ(this.sql),Y=await this.client.query(X,this.bindings);return{success:!0,results:Y.rows??[],meta:v(J,{changes:typeof Y.rowCount==="number"?Y.rowCount:void 0,command:Y.command})}}async first(){let J=OJ(this.sql);return(await this.client.query(J,this.bindings)).rows?.[0]??null}}class FJ{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new FJ(this.client,this.sql,J)}async run(){let J=Date.now(),X=await WJ(this.client,this.sql,this.bindings);if(Array.isArray(X))return{success:!0,results:X,meta:v(J)};let Y=X;return{success:!0,results:[],meta:v(J,{changes:Y.affectedRows,last_row_id:Y.insertId,warningStatus:Y.warningStatus})}}async all(){let J=Date.now(),X=await WJ(this.client,this.sql,this.bindings);return{success:!0,results:Array.isArray(X)?X:[],meta:v(J,{changes:!Array.isArray(X)?X.affectedRows:void 0})}}async first(){let J=await WJ(this.client,this.sql,this.bindings);if(!Array.isArray(J)||J.length===0)return null;return J[0]}}class LJ{client;sql;bindings;constructor(J,X,Y=[]){this.client=J,this.sql=X,this.bindings=Y}bind(...J){return new LJ(this.client,this.sql,J)}async run(){let J=Date.now();if(typeof this.client.execute==="function"){let G=await this.client.execute(this.sql,this.bindings);return{success:!0,results:UJ(G),meta:v(J)}}let X=this.client.prepare?.(this.sql);if(!X||typeof X.run!=="function")throw new _("SQLite client must expose execute() or prepare().run()","SQLITE_CLIENT_INVALID");let Z=await X.run(...this.bindings)??{};return{success:!0,results:[],meta:v(J,{changes:t(Z.changes),last_row_id:Z.lastInsertRowid??Z.lastID})}}async all(){let J=Date.now();if(typeof this.client.execute==="function"){let Z=await this.client.execute(this.sql,this.bindings);return{success:!0,results:UJ(Z),meta:v(J)}}let X=this.client.prepare?.(this.sql);if(!X||typeof X.all!=="function")throw new _("SQLite client must expose execute() or prepare().all()","SQLITE_CLIENT_INVALID");let Y=await X.all(...this.bindings);return{success:!0,results:Array.isArray(Y)?Y:[],meta:v(J)}}async first(){if(typeof this.client.execute==="function"){let X=await this.client.execute(this.sql,this.bindings);return UJ(X)[0]??null}let J=this.client.prepare?.(this.sql);if(!J)throw new _("SQLite client must expose execute() or prepare().get()","SQLITE_CLIENT_INVALID");if(typeof J.get==="function"){let X=await J.get(...this.bindings);return X===void 0||X===null?null:X}if(typeof J.all==="function"){let X=await J.all(...this.bindings);if(!Array.isArray(X)||X.length===0)return null;let Y=X[0];return Y===void 0||Y===null?null:Y}throw new _("SQLite prepare() result must expose get() or all()","SQLITE_CLIENT_INVALID")}}class AJ{client;sqlTag;sqlText;bindings;constructor(J,X,Y,Z=[]){this.client=J,this.sqlTag=X,this.sqlText=Y,this.bindings=Z}bind(...J){return new AJ(this.client,this.sqlTag,this.sqlText,J)}async run(){let J=Date.now(),X=HJ(this.sqlTag,this.sqlText,this.bindings),Y=await MX(this.client,X);return{success:!0,results:VJ(Y),meta:v(J,kJ(Y))}}async all(){let J=Date.now(),X=HJ(this.sqlTag,this.sqlText,this.bindings),Y=await bJ(this.client,X);return{success:!0,results:VJ(Y),meta:v(J,kJ(Y))}}async first(){let J=HJ(this.sqlTag,this.sqlText,this.bindings),X=await NX(this.client,J),Y=VJ(X);if(Y.length>0)return Y[0]??null;if(X&&typeof X==="object"&&"row"in X){let Z=X.row;return Z===void 0||Z===null?null:Z}if(X&&typeof X==="object"&&!Array.isArray(X)&&!("rows"in X)&&!("results"in X)&&!("data"in X))return X;return null}}async function vX(J,X,Y,Z){try{let G=await J.scan(X,{MATCH:Y,COUNT:Z});return qJ(G)}catch{let G=await J.scan(X,"MATCH",Y,"COUNT",String(Z));return qJ(G)}}function qJ(J){if(Array.isArray(J))return{cursor:String(J[0]??"0"),keys:Array.isArray(J[1])?J[1]:[]};return{cursor:String(J.cursor??"0"),keys:Array.isArray(J.keys)?J.keys:[]}}async function WJ(J,X,Y){if(typeof J.execute==="function"){let Z=await J.execute(X,Y);if(Array.isArray(Z))return Z[0];return Z}if(typeof J.query==="function"){let Z=await J.query(X,Y);if(Array.isArray(Z))return Z[0];return Z}throw new _("MySQL client must expose execute() or query()","MYSQL_CLIENT_INVALID")}async function MX(J,X){if(typeof J.run==="function")return await J.run(X);if(typeof J.execute==="function")return await J.execute(X);if(typeof J.all==="function")return await J.all(X);throw new _("Drizzle client must expose run(), execute(), or all()","DRIZZLE_CLIENT_INVALID")}async function bJ(J,X){if(typeof J.all==="function")return await J.all(X);if(typeof J.execute==="function")return await J.execute(X);if(typeof J.run==="function")return await J.run(X);throw new _("Drizzle client must expose all(), execute(), or run()","DRIZZLE_CLIENT_INVALID")}async function NX(J,X){if(typeof J.get==="function")return await J.get(X);return await bJ(J,X)}function HJ(J,X,Y){let Z=CX(X),G=Z.length-1;if(G!==Y.length)throw new _(`Drizzle binding mismatch: expected ${G} bindings, received ${Y.length}`,"DRIZZLE_BINDINGS_MISMATCH");if(G===0)return J.raw(X);let $=typeof J.empty==="function"?J.empty():J.raw("");for(let W=0;W<Z.length;W++){let H=Z[W];if(H)$.append(J.raw(H));if(W<G)$.append(J`${Y[W]}`)}return $}function CX(J){let X=[],Y=0,Z=!1,G=!1,$=!1,W=!1;for(let H=0;H<J.length;H++){let V=J[H],U=H+1<J.length?J[H+1]:"";if($){if(V===`
17
+ `)$=!1;continue}if(W){if(V==="*"&&U==="/")H++,W=!1;continue}if(!Z&&!G){if(V==="-"&&U==="-"){H++,$=!0;continue}if(V==="/"&&U==="*"){H++,W=!0;continue}}if(V==="'"&&!G){if(Z&&U==="'"){H++;continue}Z=!Z;continue}if(V==='"'&&!Z){if(G&&U==='"'){H++;continue}G=!G;continue}if(V==="?"&&!Z&&!G)X.push(J.slice(Y,H)),Y=H+1}return X.push(J.slice(Y)),X}function VJ(J){if(Array.isArray(J)){if(J.length===2&&Array.isArray(J[0]))return J[0];if(J.length===2&&J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0])&&(Array.isArray(J[1])||J[1]===null||J[1]===void 0))return[];return J}if(J&&typeof J==="object"){let X=J;if(Array.isArray(X.rows))return X.rows;if(Array.isArray(X.results))return X.results;if(Array.isArray(X.data))return X.data}return[]}function kJ(J){if(!J)return{};let X;if(Array.isArray(J)&&J.length===2&&J[0]&&typeof J[0]==="object"&&!Array.isArray(J[0]))X=J[0];else if(typeof J==="object"&&!Array.isArray(J))X=J;if(!X)return{};let Y={},Z=t(X.rowCount)??t(X.changes)??t(X.affectedRows);if(Z!==void 0)Y.changes=Z;let G=X.lastInsertRowid??X.lastInsertId??X.insertId;if(typeof G==="number"||typeof G==="string")Y.last_row_id=G;if(X.meta&&typeof X.meta==="object")Object.assign(Y,X.meta);return Y}async function qX(J,X){if(typeof J.get==="function")return await J.get(X);if(typeof J.getItem==="function")return await J.getItem(X);throw new _("NuxtHub KV client must expose get() or getItem()","NUXTHUB_KV_CLIENT_INVALID")}async function kX(J,X,Y){if(typeof J.set==="function"){await J.set(X,Y);return}if(typeof J.setItem==="function"){await J.setItem(X,Y);return}throw new _("NuxtHub KV client must expose set() or setItem()","NUXTHUB_KV_CLIENT_INVALID")}async function SX(J,X){if(typeof J.del==="function"){await J.del(X);return}if(typeof J.removeItem==="function"){await J.removeItem(X);return}throw new _("NuxtHub KV client must expose del() or removeItem()","NUXTHUB_KV_CLIENT_INVALID")}async function fX(J,X){let Y;if(typeof J.keys==="function")Y=await J.keys(X);else if(typeof J.getKeys==="function")Y=await J.getKeys(X);else throw new _("NuxtHub KV client must expose keys() or getKeys()","NUXTHUB_KV_CLIENT_INVALID");if(!Array.isArray(Y))return[];if(!X)return[...Y];return Y.filter((Z)=>Z.startsWith(X))}function UJ(J){if(Array.isArray(J))return J;if(J&&typeof J==="object"){let X=J;if(Array.isArray(X.rows))return X.rows;if(Array.isArray(X.results))return X.results}return[]}function v(J,X={}){return{duration:Date.now()-J,...X}}function t(J){if(typeof J==="number"&&Number.isFinite(J))return J;return}var c=new Map;function OJ(J){let X=c.get(J);if(X)return X;let Y="",Z=0,G=!1,$=!1,W=!1,H=!1;for(let V=0;V<J.length;V++){let U=J[V],O=V+1<J.length?J[V+1]:"";if(W){if(Y+=U,U===`
18
18
  `)W=!1;continue}if(H){if(Y+=U,U==="*"&&O==="/")Y+="/",V++,H=!1;continue}if(!G&&!$){if(U==="-"&&O==="-"){Y+="--",V++,W=!0;continue}if(U==="/"&&O==="*"){Y+="/*",V++,H=!0;continue}}if(U==="'"&&!$){G=!G,Y+=U;continue}if(U==='"'&&!G){$=!$,Y+=U;continue}if(U==="?"&&!G&&!$){Z++,Y+=`$${Z}`;continue}Y+=U}if(c.set(J,Y),c.size>5000){let V=c.keys().next().value;if(V)c.delete(V)}return Y}m();export{n as validateTableForSharding,GJ as schemaExists,_X as runShard,AX as runAllShards,$X as run,nJ as resetConfig,VX as reassignShard,s as prepare,RJ as migrateRecord,b as listTables,UX as listKnownShards,BX as isSQLDatabase,xX as isKVStorage,DJ as integrateExistingDatabase,MJ as initializeAsync,oJ as initialize,OX as getShardStats,PX as getDatabaseSizeForShard,aJ as getClosestRegionFromIP,QX as flush,LX as firstShard,jX as firstAllShards,HX as first,TJ as dropSchema,l as discoverExistingRecordsWithColumns,o as discoverExistingPrimaryKeys,TX as createValkeyKVProvider,EJ as createSchemaAcrossShards,GX as createSchema,RX as createSQLiteProvider,SJ as createRedisKVProvider,fJ as createPostgreSQLProvider,zX as createNuxtHubKVProvider,KJ as createMySQLProvider,zJ as createMappingsForExistingKeys,DX as createHyperdrivePostgresProvider,wX as createHyperdriveMySQLProvider,a as createDrizzleSQLProvider,lJ as collegedb,vJ as clearShardMigrationCache,xJ as clearMigrationCache,BJ as checkMigrationNeeded,wJ as autoDetectAndMigrate,FX as allShard,IX as allAllShards,WX as all,$J as ShardCoordinator,k as KVShardMapper,_ as CollegeDBError};
19
19
 
20
- //# debugId=B2F0A9ADB6FD57E164756E2164756E21
20
+ //# debugId=5E9B10391C3C7EF564756E2164756E21
21
21
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -8,9 +8,9 @@
8
8
  "/**\n * @fileoverview Main routing and query distribution logic for CollegeDB\n *\n * This module provides the core functionality for routing database queries to the\n * appropriate D1 shard based on primary key mappings. It handles shard selection,\n * database routing, and provides a unified API for CRUD operations across multiple\n * distributed D1 databases.\n *\n * Key responsibilities:\n * - Initialize and manage the global CollegeDB configuration\n * - Route queries to appropriate shards based on primary key mappings\n * - Implement shard allocation strategies (round-robin, random, hash-based)\n * - Provide unified CRUD operations across distributed shards\n * - Coordinate with Durable Objects for centralized shard management\n * - Handle shard rebalancing and data migration\n *\n * @example\n * ```typescript\n * import { initialize, insert, first, run } from 'collegedb';\n *\n * // Initialize the system\n * initialize({\n * kv: env.KV,\n * coordinator: env.ShardCoordinator,\n * shards: {\n * 'db-east': env.DB_EAST,\n * 'db-west': env.DB_WEST\n * },\n * strategy: 'hash'\n * });\n *\n * // Insert a record (automatically routed to appropriate shard)\n * await run('user-123', 'INSERT INTO users (id, name) VALUES (?, ?)', ['user-123', 'John']);\n *\n * // Query the record (routed to same shard)\n * const result = await first('user-123', 'SELECT * FROM users WHERE id = ?', ['user-123']);\n * ```\n *\n * @author CollegeDB Team\n * @since 1.0.0\n */\n\nimport type { Request } from '@cloudflare/workers-types';\nimport { CollegeDBError } from './errors';\nimport { KVShardMapper } from './kvmap';\nimport type {\n\tCollegeDBConfig,\n\tD1Region,\n\tOperationType,\n\tPreparedStatement,\n\tQueryResult,\n\tSQLDatabase,\n\tShardLocation,\n\tShardStats,\n\tShardingStrategy\n} from './types';\n\n/**\n * Global configuration for the collegedb instance\n *\n * Stores the system-wide configuration including KV namespace, available shards,\n * coordinator settings, and allocation strategy. Must be initialized before\n * any routing operations can be performed.\n *\n * @private\n */\nlet globalConfig: CollegeDBConfig | null = null;\n\n/**\n * Shared mapper instance for the active configuration.\n *\n * Reusing a single mapper preserves in-memory caches and avoids repeated\n * constructor/setup overhead on each operation.\n *\n * @private\n */\nlet globalMapper: KVShardMapper | null = null;\n\n/**\n * In-memory cache for per-shard size checks.\n * @private\n */\nconst shardSizeCache = new Map<string, { size: number; expiresAt: number }>();\n\n/**\n * Gets the shared mapper for the active configuration.\n * @private\n */\nfunction getMapper(config: CollegeDBConfig): KVShardMapper {\n\tif (!globalMapper) {\n\t\tglobalMapper = new KVShardMapper(config.kv, {\n\t\t\thashShardMappings: config.hashShardMappings,\n\t\t\tmappingCacheTtlMs: config.mappingCacheTtlMs,\n\t\t\tknownShardsCacheTtlMs: config.knownShardsCacheTtlMs\n\t\t});\n\t}\n\n\treturn globalMapper;\n}\n\n/**\n * Sets up the global configuration for the CollegeDB system. This must be called\n * before any other operations can be performed. The configuration includes KV\n * storage, available D1 shards, optional coordinator, and allocation strategy.\n *\n * This will also automatically detect and migrate existing databases without requiring\n * additional setup. If shards contain existing data with primary keys, CollegeDB\n * will automatically create the necessary mappings for seamless operation.\n *\n * @param config - Configuration object containing all necessary bindings and settings\n * @throws {Error} If configuration is invalid or required bindings are missing\n * @example\n * ```typescript\n * // Basic setup with multiple shards - auto-migration happens automatically\n * initialize({\n * kv: env.KV,\n * shards: {\n * 'db-primary': env.DB_PRIMARY, // Existing DB with data\n * 'db-secondary': env.DB_SECONDARY // Another existing DB\n * },\n * strategy: 'round-robin'\n * });\n * // Existing data is now automatically accessible via CollegeDB!\n *\n * // Advanced setup with coordinator\n * initialize({\n * kv: env.KV,\n * coordinator: env.ShardCoordinator,\n * shards: {\n * 'db-east': env.DB_EAST,\n * 'db-west': env.DB_WEST,\n * 'db-central': env.DB_CENTRAL\n * },\n * strategy: 'hash'\n * });\n * ```\n */\nexport function initialize(config: CollegeDBConfig) {\n\tglobalConfig = config;\n\tglobalMapper = new KVShardMapper(config.kv, {\n\t\thashShardMappings: config.hashShardMappings,\n\t\tmappingCacheTtlMs: config.mappingCacheTtlMs,\n\t\tknownShardsCacheTtlMs: config.knownShardsCacheTtlMs\n\t});\n\tshardSizeCache.clear();\n\n\t// Background: sync KV known shards with configured shards\n\ttry {\n\t\tconst mapper = getMapper(config);\n\t\tPromise.resolve()\n\t\t\t.then(async () => {\n\t\t\t\tconst existing = await mapper.getKnownShards();\n\t\t\t\tconst merged = Array.from(new Set([...existing, ...Object.keys(config.shards)]));\n\t\t\t\tawait mapper.setKnownShards(merged);\n\t\t\t})\n\t\t\t.catch(() => void 0);\n\t} catch {}\n\n\tif (config.shards && Object.keys(config.shards).length > 0 && !config.disableAutoMigration) {\n\t\tperformAutoMigration(config).catch((error) => {\n\t\t\tconsole.warn('Background auto-migration failed:', error);\n\t\t});\n\t}\n}\n\n/**\n * Sets up the global configuration for the CollegeDB system asynchronously.\n * This must be called before any other operations can be performed. The\n * configuration includes KVstorage, available D1 shards, optional coordinator,\n * and allocation strategy.\n *\n * This will also automatically detect and migrate existing databases without requiring\n * additional setup. If shards contain existing data with primary keys, CollegeDB\n * will automatically create the necessary mappings for seamless operation.\n *\n * Compared to `initialize`, this method waits for the background check to finish.\n *\n * @param config - Configuration object containing all necessary bindings and settings\n * @throws {Error} If configuration is invalid or required bindings are missing\n * @example\n * ```typescript\n * // Basic setup with multiple shards - auto-migration happens automatically\n * initializeAsync({\n * kv: env.KV,\n * shards: {\n * 'db-primary': env.DB_PRIMARY, // Existing DB with data\n * 'db-secondary': env.DB_SECONDARY // Another existing DB\n * },\n * strategy: 'round-robin'\n * });\n * // Existing data is now automatically accessible via CollegeDB!\n *\n * // Advanced setup with coordinator\n * initializeAsync({\n * kv: env.KV,\n * coordinator: env.ShardCoordinator,\n * shards: {\n * 'db-east': env.DB_EAST,\n * 'db-west': env.DB_WEST,\n * 'db-central': env.DB_CENTRAL\n * },\n * strategy: 'hash'\n * });\n * ```\n */\nexport async function initializeAsync(config: CollegeDBConfig) {\n\tglobalConfig = config;\n\tglobalMapper = new KVShardMapper(config.kv, {\n\t\thashShardMappings: config.hashShardMappings,\n\t\tmappingCacheTtlMs: config.mappingCacheTtlMs,\n\t\tknownShardsCacheTtlMs: config.knownShardsCacheTtlMs\n\t});\n\tshardSizeCache.clear();\n\n\t// Sync KV known shards with configured shards (awaited in async init)\n\ttry {\n\t\tconst mapper = getMapper(config);\n\t\tconst existing = await mapper.getKnownShards();\n\t\tconst merged = Array.from(new Set([...existing, ...Object.keys(config.shards)]));\n\t\tawait mapper.setKnownShards(merged);\n\t} catch {}\n\n\tif (config.shards && Object.keys(config.shards).length > 0 && !config.disableAutoMigration)\n\t\ttry {\n\t\t\tawait performAutoMigration(config);\n\t\t} catch (error) {\n\t\t\tconsole.warn('Auto migration failed:', error);\n\t\t}\n}\n\n/**\n * Initializes the configuration and then performs a callback once the configuration\n * has finished initializing.\n *\n * @param config - CollegeDB Configuration\n * @param callback - The callback to perform after the initialization\n * @returns The result of the callback\n * @example\n * ```\n * import { collegedb, first } from 'collegedb'\n *\n * const result = collegedb({\n * kv: env.KV,\n * shards: {\n * 'db-primary': env.DB_PRIMARY, // Existing DB with data\n * 'db-secondary': env.DB_SECONDARY // Another existing DB\n * },\n * strategy: 'hash'\n * }, async () => {\n * return await first('user-123', 'SELECT * FROM users WHERE id = ?', ['user-123']);\n * });\n * ```\n */\nexport async function collegedb<T>(config: CollegeDBConfig, callback: () => T) {\n\tawait initializeAsync(config);\n\treturn await callback();\n}\n\n/**\n * Performs automatic migration detection for all shards in the background\n *\n * This function runs asynchronously after initialization to check all configured\n * shards for existing data that needs migration. It's designed to be non-blocking\n * and won't interfere with immediate database operations.\n *\n * @private\n * @param config - CollegeDB configuration\n */\nasync function performAutoMigration(config: CollegeDBConfig): Promise<void> {\n\ttry {\n\t\tconst { autoDetectAndMigrate } = await import('./migrations');\n\t\tconst shardNames = Object.keys(config.shards);\n\n\t\tif (config.debug) {\n\t\t\tconsole.log(`🔍 Checking ${shardNames.length} shards for existing data...`);\n\t\t}\n\n\t\t// Check each shard for migration needs\n\t\tconst migrationPromises = shardNames.map(async (shardName) => {\n\t\t\tconst database = config.shards[shardName];\n\t\t\tif (!database) return null;\n\n\t\t\ttry {\n\t\t\t\tconst result = await autoDetectAndMigrate(database, shardName, config, {\n\t\t\t\t\tmaxRecordsToCheck: 1000\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tshardName,\n\t\t\t\t\t...result\n\t\t\t\t};\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(`Auto-migration failed for shard ${shardName}:`, error);\n\t\t\t\treturn null;\n\t\t\t}\n\t\t});\n\n\t\tconst results = await Promise.all(migrationPromises);\n\t\tconst successfulMigrations = results.filter((r) => r?.migrationPerformed);\n\n\t\tif (config.debug) {\n\t\t\tif (successfulMigrations.length > 0) {\n\t\t\t\tconst totalRecords = successfulMigrations.reduce((sum, r) => sum + (r?.recordsMigrated || 0), 0);\n\t\t\t\tconsole.log(`🎉 Auto-migration completed! Migrated ${totalRecords} records across ${successfulMigrations.length} shards`);\n\t\t\t\tsuccessfulMigrations.forEach((result) => {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tconsole.log(` ✅ ${result.shardName}: ${result.recordsMigrated} records from ${result.tablesProcessed} tables`);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconsole.log('✅ All shards ready - no migration needed');\n\t\t\t}\n\t\t}\n\t} catch (error) {\n\t\tconsole.warn('Background auto-migration setup failed:', error);\n\t}\n}\n\n/**\n * Resets the global configuration (for testing purposes only)\n *\n * @private\n * @internal\n */\nexport function resetConfig(): void {\n\tglobalConfig = null;\n\tglobalMapper = null;\n\tshardSizeCache.clear();\n}\n\n/**\n * Gets the global configuration, throwing an error if not initialized\n *\n * Internal utility function that retrieves the global configuration and\n * ensures the system has been properly initialized before performing\n * any operations.\n *\n * @private\n * @returns The global CollegeDB configuration\n * @throws {Error} If initialize() has not been called yet\n */\nfunction getConfig(): CollegeDBConfig {\n\tif (!globalConfig) {\n\t\tthrow new CollegeDBError('CollegeDB not initialized. Call initialize() first.', 'NOT_INITIALIZED');\n\t}\n\treturn globalConfig;\n}\n\n/**\n * Determines the operation type from a SQL statement\n * @private\n * @param sql - The SQL statement to analyze\n * @returns The operation type ('read' for SELECT, 'write' for INSERT/UPDATE/DELETE)\n */\nfunction getOperationType(sql: string): OperationType {\n\tconst sql0 = sql.trim().toUpperCase();\n\n\tif (\n\t\tsql0.startsWith('SELECT') ||\n\t\tsql0.startsWith('VALUES') ||\n\t\tsql0.startsWith('TABLE') ||\n\t\tsql0.startsWith('PRAGMA') ||\n\t\tsql0.startsWith('EXPLAIN') ||\n\t\tsql0.startsWith('WITH') ||\n\t\tsql0.startsWith('SHOW')\n\t) {\n\t\treturn 'read';\n\t}\n\n\t// All other operations (INSERT, UPDATE, DELETE, CREATE, DROP, ALTER, etc.) are considered writes\n\treturn 'write';\n}\n\n/**\n * Resolves the effective sharding strategy based on configuration and operation type\n * @private\n * @param config - CollegeDB configuration\n * @param type - The type of operation being performed\n * @returns The effective sharding strategy to use\n */\nfunction resolveStrategy(config: CollegeDBConfig, type: OperationType): ShardingStrategy {\n\tconst strategy = config.strategy || 'hash';\n\n\tif (typeof strategy === 'string') {\n\t\treturn strategy;\n\t}\n\n\t// Fallbacks for partially specified mixed strategies\n\tconst mixed = strategy as Partial<Record<OperationType, ShardingStrategy>>;\n\treturn (mixed[type] || mixed.write || mixed.read || 'hash') as ShardingStrategy;\n}\n\n/**\n * Calculates the relative distance between two D1 regions for location-based sharding.\n * Lower values indicate closer regions with better expected latency.\n *\n * @private\n * @param from - Source region\n * @param to - Target region\n * @returns Relative distance score (lower is better)\n */\nfunction calculateRegionDistance(from: D1Region, to: D1Region): number {\n\t// Same region = optimal\n\tif (from === to) return 0;\n\n\t// Define region coordinates (approximate)\n\tconst regionCoords: Record<D1Region, { lat: number; lon: number }> = {\n\t\twnam: { lat: 37.7749, lon: -122.4194 }, // San Francisco\n\t\tenam: { lat: 40.7128, lon: -74.006 }, // New York\n\t\tweur: { lat: 51.5074, lon: -0.1278 }, // London\n\t\teeur: { lat: 52.52, lon: 13.405 }, // Berlin\n\t\tapac: { lat: 35.6762, lon: 139.6503 }, // Tokyo\n\t\toc: { lat: -33.8688, lon: 151.2093 }, // Sydney\n\t\tme: { lat: 25.2048, lon: 55.2708 }, // Dubai\n\t\taf: { lat: -26.2041, lon: 28.0473 } // Johannesburg\n\t};\n\n\tconst fromCoord = regionCoords[from];\n\tconst toCoord = regionCoords[to];\n\n\t// Simple Euclidean distance calculation\n\tconst latDiff = fromCoord.lat - toCoord.lat;\n\tconst lonDiff = fromCoord.lon - toCoord.lon;\n\treturn Math.sqrt(latDiff * latDiff + lonDiff * lonDiff);\n}\n\n/**\n * Determines the closest D1 region based on an IP address.\n * Uses IP geolocation to estimate the user's location and find the nearest D1 region.\n *\n * This function uses Cloudflare's CF object which provides geolocation data\n * in Cloudflare Workers environment. Falls back to 'wnam' if geolocation fails.\n *\n * @param request - The incoming Request object (contains CF geolocation data in Cloudflare Workers)\n * @returns The closest D1Region based on IP geolocation\n * @example\n * ```typescript\n * // In a Cloudflare Worker\n * export default {\n * async fetch(request: Request, env: Env) {\n * const userRegion = getClosestRegionFromIP(request);\n *\n * initialize({\n * kv: env.KV,\n * strategy: 'location',\n * targetRegion: userRegion, // Automatically optimized for user location\n * shardLocations: { ... },\n * shards: { ... }\n * });\n * }\n * };\n * ```\n */\nexport function getClosestRegionFromIP(request: Request): D1Region {\n\tconst cf = request.cf;\n\n\tif (!cf || !cf.country) {\n\t\treturn 'wnam';\n\t}\n\n\tconst country = cf.country as string;\n\tconst continent = cf.continent as string;\n\n\t// Western North America\n\tif (['US', 'CA', 'MX'].includes(country)) {\n\t\t// Further refine by region/state if available\n\t\tconst region = (cf.region || cf.regionCode || '') as string;\n\t\tconst timezone = (cf.timezone || '') as string;\n\n\t\t// West Coast indicators\n\t\tif (\n\t\t\tregion.includes('CA') ||\n\t\t\tregion.includes('WA') ||\n\t\t\tregion.includes('OR') ||\n\t\t\tregion.includes('NV') ||\n\t\t\tregion.includes('AZ') ||\n\t\t\tregion.includes('UT') ||\n\t\t\ttimezone.includes('Pacific') ||\n\t\t\ttimezone.includes('America/Los_Angeles')\n\t\t) {\n\t\t\treturn 'wnam';\n\t\t}\n\n\t\t// East Coast and Central - default to Eastern North America\n\t\treturn 'enam';\n\t}\n\n\t// Eastern North America (broader North America)\n\tif (['GL', 'PM', 'BM'].includes(country)) {\n\t\treturn 'enam';\n\t}\n\n\t// Western Europe\n\tif (['GB', 'IE', 'FR', 'ES', 'PT', 'NL', 'BE', 'LU', 'CH', 'AT', 'IT'].includes(country)) {\n\t\treturn 'weur';\n\t}\n\n\t// Eastern Europe\n\tif (\n\t\t[\n\t\t\t'DE',\n\t\t\t'PL',\n\t\t\t'CZ',\n\t\t\t'SK',\n\t\t\t'HU',\n\t\t\t'SI',\n\t\t\t'HR',\n\t\t\t'BA',\n\t\t\t'RS',\n\t\t\t'ME',\n\t\t\t'MK',\n\t\t\t'AL',\n\t\t\t'BG',\n\t\t\t'RO',\n\t\t\t'MD',\n\t\t\t'UA',\n\t\t\t'BY',\n\t\t\t'LT',\n\t\t\t'LV',\n\t\t\t'EE',\n\t\t\t'FI',\n\t\t\t'SE',\n\t\t\t'NO',\n\t\t\t'DK',\n\t\t\t'IS'\n\t\t].includes(country)\n\t) {\n\t\treturn 'eeur';\n\t}\n\n\t// Russia - closer to Eastern Europe for most population centers\n\tif (country === 'RU') {\n\t\treturn 'eeur';\n\t}\n\n\t// Asia Pacific\n\tif (['JP', 'KR', 'CN', 'HK', 'TW', 'MO', 'MN', 'KP'].includes(country)) {\n\t\treturn 'apac';\n\t}\n\n\t// Southeast Asia and South Asia -> APAC\n\tif (\n\t\t['TH', 'VN', 'SG', 'MY', 'ID', 'PH', 'BN', 'KH', 'LA', 'MM', 'TL', 'IN', 'PK', 'BD', 'LK', 'NP', 'BT', 'MV', 'AF'].includes(country)\n\t) {\n\t\treturn 'apac';\n\t}\n\n\t// Oceania\n\tif (['AU', 'NZ', 'PG', 'FJ', 'NC', 'VU', 'SB', 'WS', 'TO', 'KI', 'NR', 'PW', 'FM', 'MH', 'TV'].includes(country)) {\n\t\treturn 'oc';\n\t}\n\n\t// Middle East\n\tif (['AE', 'SA', 'QA', 'KW', 'BH', 'OM', 'YE', 'IQ', 'IR', 'SY', 'LB', 'JO', 'IL', 'PS', 'TR', 'CY'].includes(country)) {\n\t\treturn 'me';\n\t}\n\n\t// Africa\n\tif (continent === 'AF' || ['EG', 'LY', 'TN', 'DZ', 'MA', 'SD', 'SS', 'ET', 'ER', 'DJ', 'SO'].includes(country)) {\n\t\treturn 'af';\n\t}\n\n\t// Central Asia -> closer to Eastern Europe\n\tif (['KZ', 'UZ', 'TM', 'TJ', 'KG'].includes(country)) {\n\t\treturn 'eeur';\n\t}\n\n\t// South America -> geographically closer to Eastern North America\n\tif (continent === 'SA' || ['BR', 'AR', 'CL', 'PE', 'CO', 'VE', 'EC', 'BO', 'PY', 'UY', 'GY', 'SR', 'GF'].includes(country)) {\n\t\treturn 'enam';\n\t}\n\n\t// Central America and Caribbean -> Eastern North America\n\tif (\n\t\t['GT', 'BZ', 'SV', 'HN', 'NI', 'CR', 'PA', 'CU', 'JM', 'HT', 'DO', 'PR', 'TT', 'BB', 'GD', 'VC', 'LC', 'DM', 'AG', 'KN'].includes(\n\t\t\tcountry\n\t\t)\n\t) {\n\t\treturn 'enam';\n\t}\n\n\t// Default fallback - Western North America (major Cloudflare hub)\n\treturn 'wnam';\n}\n\nfunction parseRegion(location: ShardLocation | D1Region): D1Region {\n\tif (typeof location === 'string') {\n\t\treturn location;\n\t}\n\n\treturn location.region || 'wnam';\n}\n\n/**\n * Gets the approximate size of a D1 database in bytes using an efficient SQL query.\n * Uses SQLite's page_count and page_size pragmas for accurate size calculation.\n *\n * @private\n * @param database - The SQL database instance to measure\n * @returns Promise resolving to the database size in bytes\n * @throws {CollegeDBError} If the size query fails\n */\nasync function getDatabaseSize(database: SQLDatabase): Promise<number> {\n\ttry {\n\t\t// Get page count and page size efficiently\n\t\tconst [pageCountResult, pageSizeResult] = await Promise.all([\n\t\t\tdatabase.prepare('PRAGMA page_count').first<{ page_count: number }>(),\n\t\t\tdatabase.prepare('PRAGMA page_size').first<{ page_size: number }>()\n\t\t]);\n\n\t\tif (!pageCountResult?.page_count || !pageSizeResult?.page_size) {\n\t\t\tthrow new CollegeDBError('Failed to retrieve database size information', 'SIZE_QUERY_FAILED');\n\t\t}\n\n\t\treturn pageCountResult.page_count * pageSizeResult.page_size;\n\t} catch (error) {\n\t\tthrow new CollegeDBError(\n\t\t\t`Failed to get database size: ${error instanceof Error ? error.message : 'Unknown error'}`,\n\t\t\t'SIZE_QUERY_FAILED'\n\t\t);\n\t}\n}\n\n/**\n * Retrieves a shard size using a short-lived in-memory cache.\n * @private\n */\nasync function getDatabaseSizeForAllocation(shardName: string, config: CollegeDBConfig): Promise<number> {\n\tconst cacheTtlMs = Math.max(0, config.sizeCacheTtlMs ?? 30_000);\n\tconst cached = shardSizeCache.get(shardName);\n\n\tif (cached && cached.expiresAt >= Date.now()) {\n\t\treturn cached.size;\n\t}\n\n\tconst database = config.shards[shardName];\n\tif (!database) {\n\t\tthrow new CollegeDBError(`Shard ${shardName} not found in configuration`, 'SHARD_NOT_FOUND');\n\t}\n\n\tconst size = await getDatabaseSize(database);\n\tif (cacheTtlMs > 0) {\n\t\tshardSizeCache.set(shardName, {\n\t\t\tsize,\n\t\t\texpiresAt: Date.now() + cacheTtlMs\n\t\t});\n\t}\n\n\treturn size;\n}\n\n/**\n * Filters available shards to exclude those that exceed the configured maximum size.\n * This is used during shard allocation to prevent new data from being assigned to\n * shards that are approaching or exceeding their size limits.\n *\n * @private\n * @param availableShards - List of shard names to filter\n * @param config - CollegeDB configuration containing maxDatabaseSize setting\n * @returns Promise resolving to filtered list of shard names\n */\nasync function filterShardsBySize(availableShards: string[], config: CollegeDBConfig): Promise<string[]> {\n\tif (typeof config.maxDatabaseSize !== 'number' || !Number.isFinite(config.maxDatabaseSize) || config.maxDatabaseSize <= 0) {\n\t\treturn availableShards;\n\t}\n\n\tconst limit = config.maxDatabaseSize;\n\n\tconst sizeChecks = await Promise.allSettled(\n\t\tavailableShards.map(async (shardName) => {\n\t\t\tconst size = await getDatabaseSizeForAllocation(shardName, config);\n\t\t\treturn {\n\t\t\t\tshard: shardName,\n\t\t\t\tsize,\n\t\t\t\twithinLimit: size < limit\n\t\t\t};\n\t\t})\n\t);\n\n\tconst validShards = sizeChecks\n\t\t.filter(\n\t\t\t(result): result is PromiseFulfilledResult<{ shard: string; size: number; withinLimit: boolean }> =>\n\t\t\t\tresult.status === 'fulfilled' && result.value.withinLimit\n\t\t)\n\t\t.map((result) => result.value.shard);\n\n\t// If all shards exceed the size limit, log warning and return all shards\n\t// to prevent complete failure (existing mappings should still work)\n\tif (validShards.length === 0) {\n\t\tif (config.debug) {\n\t\t\tconsole.warn('All shards exceed maxDatabaseSize limit. Allowing allocation to prevent failure.');\n\t\t}\n\t\treturn availableShards;\n\t}\n\n\tif (config.debug && validShards.length < availableShards.length) {\n\t\tconst excludedShards = availableShards.filter((shard) => !validShards.includes(shard));\n\t\tconsole.log(`Excluded ${excludedShards.length} shards due to size limits: ${excludedShards.join(', ')}`);\n\t}\n\n\treturn validShards;\n}\n\n/**\n * Selects the optimal shard for location-based allocation strategy.\n * Prioritizes shards in the target region, then nearby regions by distance.\n *\n * @private\n * @param targetRegion - The preferred region for allocation\n * @param availableShards - List of available shard names\n * @param shardLocations - Geographic locations of each shard\n * @param primaryKey - The primary key being allocated (for consistent tiebreaking)\n * @returns Selected shard name\n */\nfunction selectShardByLocation(\n\ttargetRegion: D1Region,\n\tavailableShards: string[],\n\tshardLocations: Record<string, ShardLocation | D1Region>,\n\tprimaryKey: string\n): string {\n\t// Filter shards that have location information\n\tconst locatedShards = availableShards.filter((shard) => shardLocations[shard]);\n\n\tif (locatedShards.length === 0) {\n\t\t// Fallback to hash if no location info available\n\t\tlet hash = 0;\n\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\tconst char = primaryKey.charCodeAt(i);\n\t\t\thash = (hash << 5) - hash + char;\n\t\t\thash = hash & hash;\n\t\t}\n\t\tconst index = Math.abs(hash) % availableShards.length;\n\t\treturn availableShards[index]!;\n\t}\n\n\t// Calculate distances and priorities\n\tconst shardScores = locatedShards.map((shard) => {\n\t\tconst location = shardLocations[shard]!;\n\t\tconst distance = calculateRegionDistance(targetRegion, parseRegion(location));\n\n\t\tconst priority = typeof location === 'object' ? location.priority || 1 : 1;\n\t\tconst score = distance - priority * 0.1;\n\n\t\treturn { shard, score, distance, priority };\n\t});\n\n\t// Sort by score (lower is better)\n\tshardScores.sort((a, b) => a.score - b.score);\n\n\tconst bestScore = shardScores[0]!.score;\n\tconst bestShards = shardScores.filter((s) => Math.abs(s.score - bestScore) < 0.01);\n\n\tif (bestShards.length === 1) {\n\t\treturn bestShards[0]!.shard;\n\t}\n\n\t// Consistent selection among best candidates\n\tlet hash = 0;\n\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\tconst char = primaryKey.charCodeAt(i);\n\t\thash = (hash << 5) - hash + char;\n\t\thash = hash & hash;\n\t}\n\tconst index = Math.abs(hash) % bestShards.length;\n\treturn bestShards[index]!.shard;\n}\n\n/**\n * Helper to select a shard locally based on the effective strategy when the coordinator\n * is unavailable or not configured. Provides sensible fallbacks to avoid hotspotting.\n * @private\n */\nfunction selectShardByStrategy(\n\teffectiveStrategy: ShardingStrategy,\n\tprimaryKey: string,\n\tavailableShards: string[],\n\tconfig: CollegeDBConfig\n): string {\n\tswitch (effectiveStrategy) {\n\t\tcase 'hash': {\n\t\t\tlet hash = 0;\n\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\tconst char = primaryKey.charCodeAt(i);\n\t\t\t\thash = (hash << 5) - hash + char;\n\t\t\t\thash = hash & hash;\n\t\t\t}\n\t\t\tconst index = Math.abs(hash) % availableShards.length;\n\t\t\treturn availableShards[index] || availableShards[0]!;\n\t\t}\n\t\tcase 'location': {\n\t\t\tif (!config.targetRegion) {\n\t\t\t\treturn selectShardByStrategy('hash', primaryKey, availableShards, config);\n\t\t\t}\n\t\t\treturn selectShardByLocation(config.targetRegion, availableShards, config.shardLocations || {}, primaryKey);\n\t\t}\n\t\tcase 'random': {\n\t\t\treturn availableShards[Math.floor(Math.random() * availableShards.length)] || availableShards[0]!;\n\t\t}\n\t\tdefault: {\n\t\t\treturn selectShardByStrategy('hash', primaryKey, availableShards, config);\n\t\t}\n\t}\n}\n\n/**\n * Gets or allocates a shard for a primary key with operation-specific strategy\n *\n * This is the core routing function that determines which shard should handle\n * a given primary key. If a mapping already exists, it returns the existing\n * shard. If not, it allocates a new shard using the configured strategy.\n *\n * Allocation strategies:\n * - **round-robin**: Cycles through shards in order (with coordinator)\n * - **random**: Randomly selects from available shards\n * - **hash**: Uses consistent hashing for deterministic assignment\n * - **location**: Selects shards based on geographic proximity to target region\n *\n * The function prefers using the Durable Object coordinator when available\n * for centralized allocation decisions, falling back to local strategies\n * when the coordinator is unavailable.\n *\n * @private\n * @param primaryKey - The primary key to route\n * @param operationType - The type of operation (read/write) for mixed strategy support\n * @returns Promise resolving to the shard binding name\n * @throws {Error} If no shards are configured or allocation fails\n * @example\n * ```typescript\n * // This function is called internally by CRUD operations\n * const readShard = await getShardForKey('user-123', 'read');\n * const writeShard = await getShardForKey('user-123', 'write');\n * console.log(`User 123 reads from: ${readShard}, writes to: ${writeShard}`);\n * ```\n */\nasync function getShardForKey(primaryKey: string, operationType: OperationType = 'write'): Promise<string> {\n\tconst config = getConfig();\n\tconst mapper = getMapper(config);\n\n\t// Check if mapping already exists\n\tconst existingMapping = await mapper.getShardMapping(primaryKey);\n\tif (existingMapping) {\n\t\treturn existingMapping.shard;\n\t}\n\n\t// Before allocating a new shard, check if any existing shards contain this key\n\tconst availableShards = Object.keys(config.shards);\n\tif (availableShards.length === 0) {\n\t\tthrow new CollegeDBError('No shards configured', 'NO_SHARDS');\n\t}\n\n\t// Filter shards by size limit if configured\n\tconst eligibleShards = await filterShardsBySize(availableShards, config);\n\n\t// If no existing mapping found after auto-migration, allocate a new shard\n\tlet selectedShard: string;\n\tconst effectiveStrategy = resolveStrategy(config, operationType);\n\n\t// Use coordinator if available for allocation\n\tif (config.coordinator) {\n\t\ttry {\n\t\t\tconst coordinatorId = config.coordinator.idFromName('default');\n\t\t\tconst coordinator = config.coordinator.get(coordinatorId);\n\n\t\t\tconst response = await coordinator.fetch('http://coordinator/allocate', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tprimaryKey,\n\t\t\t\t\tstrategy: effectiveStrategy, // Use resolved strategy instead of config.strategy\n\t\t\t\t\toperationType, // Pass operation type for coordinator awareness\n\t\t\t\t\ttargetRegion: config.targetRegion,\n\t\t\t\t\tshardLocations: config.shardLocations,\n\t\t\t\t\tavailableShards: eligibleShards // Pass filtered shards to coordinator\n\t\t\t\t})\n\t\t\t});\n\n\t\t\tif (response.ok) {\n\t\t\t\tconst result = (await response.json()) as { shard: string };\n\t\t\t\tselectedShard = result.shard;\n\t\t\t} else {\n\t\t\t\tselectedShard = selectShardByStrategy(effectiveStrategy, primaryKey, eligibleShards, config);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Coordinator allocation failed, falling back to local strategy:', error);\n\t\t\tselectedShard = selectShardByStrategy(effectiveStrategy, primaryKey, eligibleShards, config);\n\t\t}\n\t} else {\n\t\tselectedShard = selectShardByStrategy(effectiveStrategy, primaryKey, eligibleShards, config);\n\t}\n\n\t// Store the mapping\n\tawait mapper.setShardMapping(primaryKey, selectedShard);\n\treturn selectedShard;\n}\n\n/**\n * Gets the D1 database instance for a primary key with operation-specific routing\n *\n * Resolves the primary key to its assigned shard and returns the corresponding\n * D1 database instance. This function handles the complete routing process\n * from primary key to database connection, with support for different strategies\n * based on operation type.\n *\n * @private\n * @param primaryKey - The primary key to route\n * @param operationType - The type of operation (read/write) for mixed strategy support\n * @returns Promise resolving to the D1 database instance\n * @throws {Error} If shard routing fails or database instance not found\n */\nasync function getDatabase(primaryKey: string, operationType: OperationType = 'write'): Promise<SQLDatabase> {\n\tconst config = getConfig();\n\tconst shard = await getShardForKey(primaryKey, operationType);\n\tconst database = config.shards[shard];\n\n\tif (!database) {\n\t\tthrow new CollegeDBError(`Shard ${shard} not found in configuration`, 'SHARD_NOT_FOUND');\n\t}\n\n\treturn database;\n}\n\n/**\n * Creates the database schema in the specified D1 database\n *\n * @param d1 - The D1 database instance to create schema in\n * @param schema - The SQL schema definition to execute\n * @returns Promise that resolves when schema creation is complete\n * @throws {Error} If schema creation fails\n * @example\n * ```typescript\n * const userSchema = `\n * CREATE TABLE users (\n * id TEXT PRIMARY KEY,\n * name TEXT NOT NULL,\n * email TEXT UNIQUE\n * );\n * `;\n * await createSchema(env.DB_NEW_SHARD, userSchema);\n * ```\n */\nexport async function createSchema(d1: SQLDatabase, schema: string): Promise<void> {\n\tconst { createSchema: createSchemaImpl } = await import('./migrations');\n\tawait createSchemaImpl(d1, schema);\n}\n\n/**\n * Prepares a SQL statement for execution with operation-aware routing.\n *\n * @param key - The primary key to route the query\n * @param sql - The SQL statement to prepare\n * @returns Promise that resolves to a prepared statement\n * @throws {Error} If preparation fails\n */\nexport async function prepare(key: string, sql: string): Promise<PreparedStatement> {\n\tconst operationType = getOperationType(sql);\n\tconst db = await getDatabase(key, operationType);\n\tconst result = db.prepare(sql);\n\treturn result;\n}\n\n/**\n * Executes a statement on the appropriate shard based on the primary key.\n * The primary key is used to determine which shard should store the record,\n * ensuring consistent routing for future queries.\n *\n * @template T - Type of the result records\n * @param key - Primary key to route the query (should match the record's primary key)\n * @param sql - SQL statement with parameter placeholders\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise that resolves when the statement is complete\n * @throws {Error} If statement fails or routing fails\n * @example\n * ```typescript\n * // Insert a new user\n * await run('user-123',\n * 'INSERT INTO users (id, name, email) VALUES (?, ?, ?)',\n * ['user-123', 'John Doe', 'john@example.com']\n * );\n *\n * // Insert a post linked to a user\n * await run('post-456',\n * 'INSERT INTO posts (id, user_id, title, content) VALUES (?, ?, ?, ?)',\n * ['post-456', 'user-123', 'Hello World', 'My first post!']\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Update user information\n * await run('user-123',\n * 'UPDATE users SET name = ?, email = ? WHERE id = ?',\n * ['John Smith', 'johnsmith@example.com', 'user-123']\n * );\n *\n * // Update post content\n * await run('post-456',\n * 'UPDATE posts SET title = ?, content = ?, updated_at = strftime(\"%s\", \"now\") WHERE id = ?',\n * ['Updated Title', 'Updated content here', 'post-456']\n * );\n * ```\n *\n * @example\n * ```typescript\n * // Delete a specific user\n * await run('user-123',\n * 'DELETE FROM users WHERE id = ?',\n * ['user-123']\n * );\n *\n * // Delete user's posts (cascade delete)\n * await run('user-123',\n * 'DELETE FROM posts WHERE user_id = ?',\n * ['user-123']\n * );\n *\n * // Delete with conditions\n * await run('user-123',\n * 'DELETE FROM posts WHERE user_id = ? AND created_at < ?',\n * ['user-123', Date.now() - 86400000] // Posts older than 1 day\n * );\n * ```\n */\nexport async function run<T = Record<string, unknown>>(key: string, sql: string, bindings: any[] = []): Promise<QueryResult<T>> {\n\tconst prepared = await prepare(key, sql);\n\tconst result = await prepared.bind(...bindings).run<T>();\n\n\tif (!result.success) {\n\t\tthrow new CollegeDBError(`Query failed: ${result.error || 'Unknown error'}`, 'QUERY_FAILED');\n\t}\n\n\treturn result;\n}\n\n/**\n * Retrieves all records matching the query for a given primary key.\n *\n * This function is useful for fetching multiple records based on a primary key.\n * It automatically routes the query to the correct shard based on the provided\n * primary key, ensuring consistent data access.\n * @param key - Primary key to route the query\n * @param sql - The SQL statement to execute\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise that resolves to the result of the update operation\n * @throws {Error} If update fails or routing fails\n *\n * @example\n * ```typescript\n * type Post = {\n * id: string;\n * user_id: string;\n * title: string;\n * content: string;\n * };\n *\n *\n * // Get user's posts\n * const postsResult = await all<Post>('user-123',\n * 'SELECT * FROM posts WHERE user_id = ? ORDER BY created_at DESC',\n * ['user-123']\n * );\n *\n * console.log(`User has ${postsResult.meta.count} posts`);\n * ```\n */\nexport async function all<T = Record<string, unknown>>(key: string, sql: string, bindings: any[] = []): Promise<QueryResult<T>> {\n\tconst prepared = await prepare(key, sql);\n\tconst result = await prepared.bind(...bindings).all<T>();\n\n\tif (!result.success) {\n\t\tthrow new CollegeDBError(`Query failed: ${result.error || 'Unknown error'}`, 'QUERY_FAILED');\n\t}\n\n\treturn result;\n}\n\n/**\n * Retrieves the first record matching the query for a given primary key.\n *\n * This function is useful for fetching a single record based on a primary key.\n * It automatically routes the query to the correct shard based on the provided\n * primary key, ensuring consistent data access.\n *\n * @template T - Type of the result record\n * @param key - Primary key to route the query\n * @param sql - SQL statement with parameter placeholders\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise that resolves to the first matching record, or null if not found\n * @throws {Error} If query fails or routing fails\n *\n * @example\n * ```typescript\n * type User = {\n * id: string;\n * name: string;\n * email: string;\n * };\n * // Get a specific user\n * const userResult = await first<User>('user-123',\n * 'SELECT * FROM users WHERE id = ?',\n * ['user-123']\n * );\n *\n * if (userResult) {\n * console.log(`Found user: ${userResult.name}`);\n * }\n */\nexport async function first<T = Record<string, unknown>>(key: string, sql: string, bindings: any[] = []): Promise<T | null> {\n\tconst prepared = await prepare(key, sql);\n\tconst result = await prepared.bind(...bindings).first<T>();\n\treturn result;\n}\n\n/**\n * Reassigns a primary key to a different shard\n *\n * Moves a primary key and its associated data from one shard to another. This\n * operation is useful for load balancing, shard maintenance, or geographic\n * redistribution of data.\n *\n * The reassignment process:\n * 1. Validates the target shard exists in configuration\n * 2. Checks that a mapping exists for the primary key\n * 3. If target shard differs from current, migrates the data\n * 4. Updates the KV mapping to point to the new shard\n *\n * **Note**: This operation involves data migration and should be used\n * carefully in production environments. Consider the impact on ongoing queries.\n *\n * @param primaryKey - Primary key to reassign to a different shard\n * @param newBinding - New shard binding name where the data should be moved\n * @param tableName - Name of the table containing the record to migrate\n * @returns Promise that resolves when reassignment and migration are complete\n * @throws {Error} If target shard not found, mapping doesn't exist, or migration fails\n * @example\n * ```typescript\n * // Move a user from east to west coast for better latency\n * try {\n * await reassignShard('user-california-123', 'db-west', 'users');\n * console.log('User successfully moved to west coast shard');\n * } catch (error) {\n * console.error('Reassignment failed:', error.message);\n * }\n *\n * // Load balancing: move high-activity user to dedicated shard\n * await reassignShard('user-enterprise-456', 'db-dedicated', 'users');\n * ```\n */\nexport async function reassignShard(primaryKey: string, newBinding: string, tableName: string): Promise<void> {\n\tconst config = getConfig();\n\n\tif (!config.shards[newBinding]) {\n\t\tthrow new CollegeDBError(`Shard ${newBinding} not found in configuration`, 'SHARD_NOT_FOUND');\n\t}\n\n\tconst mapper = getMapper(config);\n\tconst currentMapping = await mapper.getShardMapping(primaryKey);\n\n\tif (!currentMapping) {\n\t\tthrow new CollegeDBError(`No existing mapping found for primary key: ${primaryKey}`, 'MAPPING_NOT_FOUND');\n\t}\n\n\t// Migrate data if different shard\n\tif (currentMapping.shard !== newBinding) {\n\t\tconst { migrateRecord } = await import('./migrations');\n\t\tconst sourceDb = config.shards[currentMapping.shard];\n\t\tconst targetDb = config.shards[newBinding];\n\n\t\tif (!sourceDb || !targetDb) {\n\t\t\tthrow new CollegeDBError('Source or target shard not available', 'SHARD_UNAVAILABLE');\n\t\t}\n\n\t\tawait migrateRecord(sourceDb, targetDb, primaryKey, tableName);\n\t}\n\n\t// Update mapping\n\tawait mapper.updateShardMapping(primaryKey, newBinding);\n}\n\n/**\n * Lists all known shards\n *\n * Returns an array of all shard binding names known to the system. First\n * attempts to get the list from the Durable Object coordinator for the most\n * up-to-date information, then falls back to the configured shards if the\n * coordinator is unavailable.\n *\n * @returns Promise resolving to array of shard binding names\n * @example\n * ```typescript\n * const shards = await listKnownShards();\n * console.log('Available shards:', shards);\n * // Output: ['db-east', 'db-west', 'db-central']\n *\n * // Check if a specific shard is available\n * if (shards.includes('db-asia')) {\n * console.log('Asia region shard is available');\n * }\n * ```\n */\nexport async function listKnownShards(): Promise<string[]> {\n\tconst config = getConfig();\n\n\t// Try to get from coordinator first\n\tif (config.coordinator) {\n\t\ttry {\n\t\t\tconst coordinatorId = config.coordinator.idFromName('default');\n\t\t\tconst coordinator = config.coordinator.get(coordinatorId);\n\n\t\t\tconst response = await coordinator.fetch('http://coordinator/shards');\n\t\t\tif (response.ok) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to get shards from coordinator:', error);\n\t\t}\n\t}\n\n\t// Fallback: merge configured shards with KV-known shards\n\ttry {\n\t\tconst mapper = getMapper(config);\n\t\tconst kvShards = await mapper.getKnownShards();\n\t\tconst merged = new Set<string>([...Object.keys(config.shards), ...kvShards]);\n\t\treturn Array.from(merged);\n\t} catch {\n\t\t// If KV lookup fails, just return configured shards\n\t\treturn Object.keys(config.shards);\n\t}\n}\n\n/**\n * Gets statistics for all shards\n *\n * Returns usage statistics for all known shards, including key counts and\n * last updated timestamps. First attempts to get real-time statistics from\n * the Durable Object coordinator, then falls back to KV-based counting.\n *\n * This information is useful for:\n * - Load balancing decisions\n * - Monitoring shard utilization\n * - Capacity planning\n * - Performance analysis\n *\n * @returns Promise resolving to array of shard statistics\n * @example\n * ```typescript\n * const stats = await getShardStats();\n * stats.forEach(shard => {\n * console.log(`${shard.binding}: ${shard.count} keys`);\n * if (shard.lastUpdated) {\n * console.log(` Last updated: ${new Date(shard.lastUpdated)}`);\n * }\n * });\n *\n * // Find most loaded shard\n * const mostLoaded = stats.reduce((prev, current) =>\n * (prev.count > current.count) ? prev : current\n * );\n * console.log(`Most loaded shard: ${mostLoaded.binding} (${mostLoaded.count} keys)`);\n * ```\n */\nexport async function getShardStats(): Promise<ShardStats[]> {\n\tconst config = getConfig();\n\n\t// Try to get from coordinator first\n\tif (config.coordinator) {\n\t\ttry {\n\t\t\tconst coordinatorId = config.coordinator.idFromName('default');\n\t\t\tconst coordinator = config.coordinator.get(coordinatorId);\n\n\t\t\tconst response = await coordinator.fetch('http://coordinator/stats');\n\t\t\tif (response.ok) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to get stats from coordinator:', error);\n\t\t}\n\t}\n\n\t// Fallback to KV-based counting\n\tconst mapper = getMapper(config);\n\tconst counts = await mapper.getShardKeyCounts();\n\n\t// Merge shards from config and KV known shards\n\tlet shardNames = Object.keys(config.shards);\n\ttry {\n\t\tconst kvKnown = await mapper.getKnownShards();\n\t\tshardNames = Array.from(new Set([...shardNames, ...kvKnown]));\n\t} catch {}\n\n\treturn shardNames.map((binding) => ({\n\t\tbinding,\n\t\tcount: counts[binding] || 0\n\t}));\n}\n\n/**\n * Bypasses the normal routing logic to execute a query directly on a specified\n * shard. This is useful for administrative operations, cross-shard queries,\n * or when you need to query data that doesn't follow the primary key routing pattern.\n *\n * **Use with caution**: This function bypasses routing safeguards and should\n * be used only when you specifically need to target a particular shard.\n *\n * @param shardBinding - The shard binding name to execute the query on\n * @param sql - SQL statement to execute\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise resolving to the result of the query execution\n * @throws {Error} If shard not found or query fails\n * @example\n * ```typescript\n * // Administrative query: insert a new user directly into a specific shard\n * const result = await runShard('db-east',\n * 'INSERT INTO users (id, name, email) VALUES (?, ?, ?)',\n * ['user-789', 'Alice', 'alice@example.com']\n * );\n * console.log(`Inserted user with ID: ${result.lastInsertId}`);\n * ```\n */\nexport async function runShard<T = Record<string, unknown>>(\n\tshardBinding: string,\n\tsql: string,\n\tbindings: any[] = []\n): Promise<QueryResult<T>> {\n\tconst config = getConfig();\n\tconst db = config.shards[shardBinding];\n\n\tif (!db) {\n\t\tthrow new CollegeDBError(`Shard ${shardBinding} not found`, 'SHARD_NOT_FOUND');\n\t}\n\n\tconst result = await db\n\t\t.prepare(sql)\n\t\t.bind(...bindings)\n\t\t.run<T>();\n\n\tif (!result.success) {\n\t\tthrow new CollegeDBError(`Query failed: ${result.error || 'Unknown error'}`, 'QUERY_FAILED');\n\t}\n\n\treturn result;\n}\n\n/**\n * Bypasses the normal routing logic to execute a query directly on a specified\n * shard. This is useful for administrative operations, cross-shard queries,\n * or when you need to query data that doesn't follow the primary key routing pattern.\n *\n * **Use with caution**: This function bypasses routing safeguards and should\n * be used only when you specifically need to target a particular shard.\n *\n * @param shardBinding - The shard binding name to execute the query on\n * @param sql - SQL statement to execute\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise resolving to structured query results\n * @throws {Error} If shard not found or query fails\n * @example\n * ```typescript\n * // Administrative query: count all users across a specific shard\n * const eastCoastStats = await allShard('db-east',\n * 'SELECT COUNT(*) as user_count FROM users'\n * );\n * console.log(`East coast users: ${eastCoastStats.results[0].user_count}`);\n *\n * // Cross-shard analytics: get recent posts from a specific region\n * const recentPosts = await allShard('db-west',\n * 'SELECT id, title, created_at FROM posts WHERE created_at > ? ORDER BY created_at DESC LIMIT ?',\n * [Date.now() - 86400000, 10] // Last 24 hours, limit 10\n * );\n *\n * // Schema inspection on specific shard\n * const tables = await allShard('db-central',\n * \"SELECT name FROM sqlite_master WHERE type='table'\"\n * );\n * ```\n */\nexport async function allShard<T = Record<string, unknown>>(\n\tshardBinding: string,\n\tsql: string,\n\tbindings: any[] = []\n): Promise<QueryResult<T>> {\n\tconst config = getConfig();\n\tconst db = config.shards[shardBinding];\n\n\tif (!db) {\n\t\tthrow new CollegeDBError(`Shard ${shardBinding} not found`, 'SHARD_NOT_FOUND');\n\t}\n\n\tconst result = await db\n\t\t.prepare(sql)\n\t\t.bind(...bindings)\n\t\t.all<T>();\n\n\treturn result;\n}\n\n/**\n * Bypasses the normal routing logic to execute a query directly on a specified\n * shard. This is useful for administrative operations, cross-shard queries,\n * or when you need to query data that doesn't follow the primary key routing pattern.\n *\n * **Use with caution**: This function bypasses routing safeguards and should\n * be used only when you specifically need to target a particular shard.\n *\n * @param shardBinding - The shard binding name to execute the query on\n * @param sql - SQL statement to execute\n * @param bindings - Parameter values to bind to the SQL statement\n * @returns Promise resolving to the first matching record, or null if not found\n * @throws {Error} If shard not found or query fails\n * @example\n * ```typescript\n * // Administrative query: get a specific user from a shard\n * const user = await firstShard('db-east',\n * 'SELECT * FROM users WHERE id = ?',\n * ['user-123']);\n * if (user) {\n * console.log(`Found user: ${user.name}`);\n * } else {\n * console.log('User not found in east shard');\n * }\n * ```\n */\nexport async function firstShard<T = Record<string, unknown>>(shardBinding: string, sql: string, bindings: any[] = []): Promise<T | null> {\n\tconst config = getConfig();\n\tconst db = config.shards[shardBinding];\n\n\tif (!db) {\n\t\tthrow new CollegeDBError(`Shard ${shardBinding} not found`, 'SHARD_NOT_FOUND');\n\t}\n\n\tconst result = await db\n\t\t.prepare(sql)\n\t\t.bind(...bindings)\n\t\t.first<T>();\n\n\treturn result;\n}\n\n/**\n * Executes a query on all shards and returns the results from each shard.\n *\n * This function is useful for scenarios where you need to aggregate data\n * from multiple shards, such as running analytics or cross-shard queries.\n * It executes the same SQL statement on each shard and collects the results.\n * @param sql - The SQL statement to execute on each shard\n * @param bindings - Parameter values to bind to the SQL statement\n * @param batchSize - Number of concurrent queries to run at once (default: 50)\n * @returns Promise resolving to an array of results from each shard\n * @since 1.0.4\n */\nexport async function runAllShards<T = Record<string, unknown>>(\n\tsql: string,\n\tbindings: any[] = [],\n\tbatchSize: number = 50\n): Promise<QueryResult<T>[]> {\n\tconst config = getConfig();\n\tconst tasks: Array<() => Promise<QueryResult<T>>> = [];\n\n\tfor (const [binding, db] of Object.entries(config.shards)) {\n\t\tif (!binding || !db) {\n\t\t\tconsole.error(`Shard ${binding ?? '<null>'} not found, skipping`);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttasks.push(() =>\n\t\t\tdb\n\t\t\t\t.prepare(sql)\n\t\t\t\t.bind(...bindings)\n\t\t\t\t.run<T>()\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(`Error executing query on shard ${binding}:`, error);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\tmeta: { duration: 0 }\n\t\t\t\t\t} satisfies QueryResult<T>;\n\t\t\t\t})\n\t\t);\n\t}\n\n\tconst out: QueryResult<T>[] = [];\n\tfor (let i = 0; i < tasks.length; i += batchSize) {\n\t\tconst batch = tasks.slice(i, i + batchSize).map((fn) => fn());\n\t\tout.push(...(await Promise.all(batch)));\n\t}\n\n\treturn out;\n}\n\n/**\n * Executes a query on all shards and returns all matching records from each shard.\n *\n * This function is useful for scenarios where you need to retrieve all records\n * matching a query across multiple shards, such as aggregating data or running\n * cross-shard analytics.\n * @param sql - The SQL statement to execute on each shard\n * @param bindings - Parameter values to bind to the SQL statement\n * @param batchSize - Number of concurrent queries to run at once (default: 50)\n * @returns Promise resolving to an array of results from each shard\n * @since 1.0.4\n */\nexport async function allAllShards<T = Record<string, unknown>>(\n\tsql: string,\n\tbindings: any[] = [],\n\tbatchSize: number = 50\n): Promise<QueryResult<T>[]> {\n\tconst config = getConfig();\n\tconst tasks: Array<() => Promise<QueryResult<T>>> = [];\n\n\tfor (const [binding, db] of Object.entries(config.shards)) {\n\t\tif (!binding || !db) {\n\t\t\tconsole.error(`Shard ${binding ?? '<null>'} not found, skipping`);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttasks.push(() =>\n\t\t\tdb\n\t\t\t\t.prepare(sql)\n\t\t\t\t.bind(...bindings)\n\t\t\t\t.all<T>()\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(`Error executing query on shard ${binding}:`, error);\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsuccess: false,\n\t\t\t\t\t\tresults: [],\n\t\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t\tmeta: { duration: 0 }\n\t\t\t\t\t} satisfies QueryResult<T>;\n\t\t\t\t})\n\t\t);\n\t}\n\n\tconst out: QueryResult<T>[] = [];\n\tfor (let i = 0; i < tasks.length; i += batchSize) {\n\t\tconst batch = tasks.slice(i, i + batchSize).map((fn) => fn());\n\t\tout.push(...(await Promise.all(batch)));\n\t}\n\n\treturn out;\n}\n\n/**\n * Executes a query on all shards and returns the first matching record from each shard.\n *\n * This function is useful for scenarios where you need to retrieve a single record\n * from each shard, such as fetching the latest entry or a specific item that may\n * exist on multiple shards.\n * @param sql - The SQL statement to execute\n * @param bindings - Parameter values to bind to the SQL statement\n * @param batchSize - Number of concurrent queries to run at once (default: 50)\n * @returns Promise resolving to an array of first matching records from each shard\n * @since 1.0.4\n */\nexport async function firstAllShards<T = Record<string, unknown>>(\n\tsql: string,\n\tbindings: any[] = [],\n\tbatchSize: number = 50\n): Promise<(T | null)[]> {\n\tconst config = getConfig();\n\tconst tasks: Array<() => Promise<T | null>> = [];\n\n\tfor (const [binding, db] of Object.entries(config.shards)) {\n\t\tif (!binding || !db) {\n\t\t\tconsole.error(`Shard ${binding ?? '<null>'} not found, skipping`);\n\t\t\tcontinue;\n\t\t}\n\n\t\ttasks.push(() =>\n\t\t\tdb\n\t\t\t\t.prepare(sql)\n\t\t\t\t.bind(...bindings)\n\t\t\t\t.first<T>()\n\t\t\t\t.catch((error) => {\n\t\t\t\t\tconsole.error(`Error executing query on shard ${binding}:`, error);\n\t\t\t\t\treturn null;\n\t\t\t\t})\n\t\t);\n\t}\n\n\tconst out: (T | null)[] = [];\n\tfor (let i = 0; i < tasks.length; i += batchSize) {\n\t\tconst batch = tasks.slice(i, i + batchSize).map((fn) => fn());\n\t\tout.push(...(await Promise.all(batch)));\n\t}\n\n\treturn out;\n}\n\n/**\n * Flushes all shard mappings (development only)\n *\n * Completely clears all primary key to shard mappings from both KV storage\n * and the Durable Object coordinator. This operation resets the entire\n * routing system to a clean state.\n *\n * **DANGER**: This operation is destructive and irreversible. After flushing,\n * all existing primary keys will be treated as new and may be assigned to\n * different shards than before, causing data routing issues.\n *\n * **Use only for**:\n * - Development and testing environments\n * - Complete system resets\n * - Emergency recovery scenarios\n *\n * @returns Promise that resolves when all mappings are cleared\n * @example\n * ```typescript\n * // Only use in development!\n * if (process.env.NODE_ENV === 'development') {\n * await flush();\n * console.log('All shard mappings cleared for testing');\n *\n * // Now all keys will be reassigned on next access\n * await run('user-123', 'INSERT INTO users (id, name) VALUES (?, ?)',\n * ['user-123', 'Test User']);\n * }\n * ```\n */\nexport async function flush(): Promise<void> {\n\tconst config = getConfig();\n\tconst mapper = getMapper(config);\n\n\tawait mapper.clearAllMappings();\n\tshardSizeCache.clear();\n\n\t// Also flush coordinator if available\n\tif (config.coordinator) {\n\t\ttry {\n\t\t\tconst coordinatorId = config.coordinator.idFromName('default');\n\t\t\tconst coordinator = config.coordinator.get(coordinatorId);\n\n\t\t\tawait coordinator.fetch('http://coordinator/flush', { method: 'POST' });\n\t\t} catch (error) {\n\t\t\tconsole.warn('Failed to flush coordinator:', error);\n\t\t}\n\t}\n}\n\n/**\n * Gets the size of a specific D1 database in bytes.\n * Uses efficient SQLite pragma queries to determine database size.\n *\n * @param shardBinding - The shard binding name to check the size of\n * @returns Promise resolving to the database size in bytes\n * @throws {CollegeDBError} If shard not found or size query fails\n * @example\n * ```typescript\n * // Get size of a specific shard\n * const sizeInBytes = await getDatabaseSizeForShard('db-east');\n * console.log(`Database size: ${Math.round(sizeInBytes / 1024 / 1024)} MB`);\n * ```\n */\nexport async function getDatabaseSizeForShard(shardBinding: string): Promise<number> {\n\tconst config = getConfig();\n\tconst database = config.shards[shardBinding];\n\n\tif (!database) {\n\t\tthrow new CollegeDBError(`Shard ${shardBinding} not found`, 'SHARD_NOT_FOUND');\n\t}\n\n\treturn await getDatabaseSize(database);\n}\n",
9
9
  "/**\n * @fileoverview Durable Object for coordinating shard allocation and maintaining statistics\n *\n * This module provides the ShardCoordinator Durable Object that manages shard allocation\n * strategies and maintains real-time statistics about shard utilization. It provides\n * an HTTP API for other parts of the system to interact with the coordinator.\n *\n * @example\n * ```typescript\n * // In wrangler.jsonc:\n * // {\n * // \"durable_objects\": {\n * // \"bindings\": [\n * // { \"name\": \"ShardCoordinator\", \"class_name\": \"ShardCoordinator\" }\n * // ]\n * // }\n * // }\n *\n * // Usage in a Worker:\n * const coordinatorId = env.ShardCoordinator.idFromName('default');\n * const coordinator = env.ShardCoordinator.get(coordinatorId);\n * const response = await coordinator.fetch('http://coordinator/allocate', {\n * method: 'POST',\n * body: JSON.stringify({ primaryKey: 'user-123', strategy: 'hash' })\n * });\n * ```\n *\n * @author CollegeDB Team\n * @since 1.0.0\n */\n\nimport type { DurableObjectState } from '@cloudflare/workers-types';\nimport { CollegeDBError } from './errors';\nimport type { D1Region, MixedShardingStrategy, OperationType, ShardCoordinatorState, ShardingStrategy } from './types';\n\n/**\n * Durable Object for coordinating shard allocation and maintaining statistics\n *\n * The ShardCoordinator is a Cloudflare Durable Object that provides centralized\n * coordination for shard allocation across multiple D1 databases. It maintains\n * state about available shards, allocation strategies, and usage statistics.\n *\n * Key responsibilities:\n * - Track available D1 shards and their current load\n * - Implement allocation strategies (round-robin, random, hash-based)\n * - Provide HTTP API for shard allocation and management\n * - Maintain persistent state using Durable Object storage\n *\n * @example\n * ```typescript\n * // Allocate a shard for a new primary key\n * const response = await coordinator.fetch('http://coordinator/allocate', {\n * method: 'POST',\n * body: JSON.stringify({ primaryKey: 'user-456', strategy: 'hash' })\n * });\n * const { shard } = await response.json();\n * ```\n */\nexport class ShardCoordinator {\n\t/**\n\t * Durable Object state handle for persistent storage\n\t * @private\n\t */\n\tprivate state: DurableObjectState;\n\n\t/**\n\t * Creates a new ShardCoordinator instance\n\t * @param state - Durable Object state provided by Cloudflare runtime\n\t */\n\tconstructor(state: DurableObjectState) {\n\t\tthis.state = state;\n\t}\n\n\t/**\n\t * Gets the current coordinator state from persistent storage\n\t *\n\t * Retrieves the coordinator state from Durable Object storage, returning\n\t * a default state if none exists. The state includes known shards, statistics,\n\t * allocation strategy, and round-robin counter.\n\t *\n\t * @private\n\t * @returns Promise resolving to the current coordinator state\n\t * @throws {Error} If storage access fails\n\t */\n\tprivate async getState(): Promise<ShardCoordinatorState> {\n\t\tconst state = await this.state.storage.get<ShardCoordinatorState>('coordinator_state');\n\t\treturn (\n\t\t\tstate || {\n\t\t\t\tknownShards: [],\n\t\t\t\tshardStats: {},\n\t\t\t\tstrategy: 'round-robin',\n\t\t\t\troundRobinIndex: 0\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Saves the coordinator state to persistent storage\n\t *\n\t * Persists the coordinator state to Durable Object storage. This includes\n\t * all shard information, statistics, and configuration.\n\t *\n\t * @private\n\t * @param state - The coordinator state to persist\n\t * @returns Promise that resolves when state is saved\n\t * @throws {Error} If storage write fails\n\t */\n\tprivate async saveState(state: ShardCoordinatorState): Promise<void> {\n\t\tawait this.state.storage.put('coordinator_state', state);\n\t}\n\n\t/**\n\t * Handles HTTP requests to the Durable Object\n\t *\n\t * Main entry point for all HTTP requests to the ShardCoordinator. Routes\n\t * requests based on method and path to appropriate handler functions.\n\t *\n\t * Supported endpoints:\n\t * - GET /shards - List all known shards\n\t * - POST /shards - Add a new shard\n\t * - DELETE /shards - Remove a shard\n\t * - GET /stats - Get shard statistics\n\t * - POST /stats - Update shard statistics\n\t * - POST /allocate - Allocate a shard for a primary key\n\t * - POST /flush - Clear all coordinator state (development only)\n\t * - GET /health - Health check endpoint\n\t *\n\t * @param request - The incoming HTTP request\n\t * @returns Promise resolving to HTTP response\n\t * @example\n\t * ```typescript\n\t * // Allocate a shard\n\t * const response = await coordinator.fetch('http://coordinator/allocate', {\n\t * method: 'POST',\n\t * headers: { 'Content-Type': 'application/json' },\n\t * body: JSON.stringify({ primaryKey: 'user-123' })\n\t * });\n\t * ```\n\t */\n\tasync fetch(request: Request): Promise<Response> {\n\t\tconst url = new URL(request.url);\n\t\tconst path = url.pathname;\n\t\tconst method = request.method;\n\n\t\ttry {\n\t\t\tswitch (`${method} ${path}`) {\n\t\t\t\tcase 'GET /shards':\n\t\t\t\t\treturn this.handleListShards();\n\t\t\t\tcase 'POST /shards':\n\t\t\t\t\treturn this.handleAddShard(request);\n\t\t\t\tcase 'DELETE /shards':\n\t\t\t\t\treturn this.handleRemoveShard(request);\n\t\t\t\tcase 'GET /stats':\n\t\t\t\t\treturn this.handleGetStats();\n\t\t\t\tcase 'POST /stats':\n\t\t\t\t\treturn this.handleUpdateStats(request);\n\t\t\t\tcase 'POST /allocate':\n\t\t\t\t\treturn this.handleAllocateShard(request);\n\t\t\t\tcase 'POST /flush':\n\t\t\t\t\treturn this.handleFlush();\n\t\t\t\tcase 'GET /health':\n\t\t\t\t\treturn new Response('OK', { status: 200 });\n\t\t\t\tdefault:\n\t\t\t\t\treturn new Response('Not Found', { status: 404 });\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('ShardCoordinator error:', error);\n\t\t\treturn new Response('Internal Server Error', { status: 500 });\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves all known shards as a JSON array of all D1 binding names that have been registered\n\t * with the coordinator.\n\t * @private\n\t * @returns Promise resolving to HTTP response with shard list\n\t * @example Response body: `[\"db-east\", \"db-west\", \"db-central\"]`\n\t */\n\tprivate async handleListShards(): Promise<Response> {\n\t\tconst state = await this.getState();\n\t\treturn new Response(JSON.stringify(state.knownShards), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Registers a new D1 database binding with the coordinator. If the shard\n\t * is already known, this operation is idempotent. Initializes statistics\n\t * for the new shard.\n\t * @private\n\t * @param request - HTTP request containing shard binding name in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON\n\t * @example Request body: `{\"shard\": \"db-new-region\"}`\n\t */\n\tprivate async handleAddShard(request: Request): Promise<Response> {\n\t\tconst { shard } = (await request.json()) as { shard: string };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tif (!state.knownShards.includes(shard)) {\n\t\t\tstate.knownShards.push(shard);\n\t\t\tstate.shardStats[shard] = {\n\t\t\t\tbinding: shard,\n\t\t\t\tcount: 0,\n\t\t\t\tlastUpdated: Date.now()\n\t\t\t};\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Unregisters a D1 database binding from the coordinator. Removes the shard\n\t * from the known shards list and deletes its statistics. Adjusts the round-robin\n\t * index if necessary to prevent out-of-bounds access.\n\t * @private\n\t * @param request - HTTP request containing shard binding name in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON\n\t * @example Request body: `{\"shard\": \"db-old-region\"}`\n\t */\n\tprivate async handleRemoveShard(request: Request): Promise<Response> {\n\t\tconst { shard } = (await request.json()) as { shard: string };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tconst index = state.knownShards.indexOf(shard);\n\t\tif (index > -1) {\n\t\t\tstate.knownShards.splice(index, 1);\n\t\t\tdelete state.shardStats[shard];\n\t\t\t// Adjust round-robin index if necessary\n\t\t\tif (state.roundRobinIndex >= state.knownShards.length) {\n\t\t\t\tstate.roundRobinIndex = 0;\n\t\t\t}\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Returns an array of statistics for all known shards, including\n\t * binding names, key counts, and last updated timestamps.\n\t * @private\n\t * @returns Promise resolving to HTTP response with statistics array\n\t * @example Response body: `[{\"binding\": \"db-east\", \"count\": 1234, \"lastUpdated\": 1672531200000}]`\n\t */\n\tprivate async handleGetStats(): Promise<Response> {\n\t\tconst state = await this.getState();\n\t\tconst stats = Object.values(state.shardStats);\n\t\treturn new Response(JSON.stringify(stats), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Updates the key count and last updated timestamp for a specific shard.\n\t * Used by other parts of the system to report changes in shard utilization.\n\t * @private\n\t * @param request - HTTP request containing shard name and count in JSON body\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @throws {Error} If request body is invalid JSON or shard doesn't exist\n\t * @example Request body: `{\"shard\": \"db-east\", \"count\": 1500}`\n\t */\n\tprivate async handleUpdateStats(request: Request): Promise<Response> {\n\t\tconst { shard, count } = (await request.json()) as { shard: string; count: number };\n\n\t\t// Validate required parameters\n\t\tif (!shard || typeof shard !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid shard parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tif (count === undefined || typeof count !== 'number') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid count parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\n\t\tif (state.shardStats[shard]) {\n\t\t\tstate.shardStats[shard].count = count;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Selects an appropriate shard for a new primary key using the specified\n\t * allocation strategy. Updates internal state for round-robin allocation.\n\t *\n\t * Supported strategies:\n\t * - round-robin: Cycles through shards in order\n\t * - random: Selects a random shard\n\t * - hash: Uses consistent hashing based on primary key\n\t *\n\t * @private\n\t * @param request - HTTP request containing primary key and optional strategy\n\t * @returns Promise resolving to HTTP response with selected shard\n\t * @throws {Error} If no shards are available or request body is invalid\n\t * @example Request body: `{\"primaryKey\": \"user-123\", \"strategy\": \"hash\"}`\n\t * @example Response body: `{\"shard\": \"db-west\"}`\n\t */\n\tprivate async handleAllocateShard(request: Request): Promise<Response> {\n\t\tconst { primaryKey, strategy, operationType, availableShards } = (await request.json()) as {\n\t\t\tprimaryKey: string;\n\t\t\tstrategy?: ShardingStrategy;\n\t\t\toperationType?: OperationType;\n\t\t\tavailableShards?: string[];\n\t\t};\n\n\t\tif (!primaryKey || typeof primaryKey !== 'string') {\n\t\t\treturn new Response(JSON.stringify({ error: 'Missing or invalid primaryKey parameter' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst state = await this.getState();\n\t\tconst eligibleShards = availableShards || state.knownShards;\n\n\t\tif (eligibleShards.length === 0) {\n\t\t\treturn new Response(JSON.stringify({ error: 'No shards available' }), {\n\t\t\t\tstatus: 400,\n\t\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t\t});\n\t\t}\n\n\t\tconst effectiveStrategy = this.resolveStrategy(state.strategy, strategy, operationType || 'write');\n\t\tconst selectedShard = this.selectShard(primaryKey, state, effectiveStrategy, eligibleShards);\n\n\t\tif (effectiveStrategy === 'round-robin') {\n\t\t\tstate.roundRobinIndex = (state.roundRobinIndex + 1) % eligibleShards.length;\n\t\t\tawait this.saveState(state);\n\t\t}\n\n\t\treturn new Response(JSON.stringify({ shard: selectedShard }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Completely clears all coordinator state from Durable Object storage.\n\t * This removes all shard registrations, statistics, and configuration.\n\t *\n\t * **WARNING**: This operation is destructive and should only be used\n\t * in development environments or during testing.\n\t *\n\t * @private\n\t * @returns Promise resolving to HTTP response indicating success\n\t * @example Response body: `{\"success\": true}`\n\t */\n\tprivate async handleFlush(): Promise<Response> {\n\t\tawait this.state.storage.deleteAll();\n\t\treturn new Response(JSON.stringify({ success: true }), {\n\t\t\theaders: { 'Content-Type': 'application/json' }\n\t\t});\n\t}\n\n\t/**\n\t * Resolves the effective sharding strategy for a given operation type\n\t *\n\t * @private\n\t * @param configStrategy - The strategy from state configuration\n\t * @param requestStrategy - Optional strategy override from request\n\t * @param operationType - The type of operation (read/write)\n\t * @returns The effective sharding strategy to use\n\t */\n\tprivate resolveStrategy(\n\t\tconfigStrategy: ShardingStrategy | MixedShardingStrategy,\n\t\trequestStrategy?: ShardingStrategy,\n\t\toperationType: OperationType = 'write'\n\t): ShardingStrategy {\n\t\t// Request strategy overrides everything\n\t\tif (requestStrategy) {\n\t\t\treturn requestStrategy;\n\t\t}\n\n\t\t// If config strategy is a string, use it for all operations\n\t\tif (typeof configStrategy === 'string') {\n\t\t\treturn configStrategy;\n\t\t}\n\n\t\t// If config strategy is a mixed strategy object, use the appropriate strategy for the operation type\n\t\treturn configStrategy[operationType];\n\t}\n\n\t/**\n\t * Implements the core shard selection logic for different allocation strategies.\n\t * Uses consistent algorithms to ensure predictable shard assignment.\n\t *\n\t * Strategy details:\n\t * - round-robin: Uses roundRobinIndex to cycle through shards\n\t * - random: Uses Math.random() for uniform distribution\n\t * - hash: Uses string hash function for consistent assignment\n\t *\n\t * @private\n\t * @param primaryKey - The primary key to allocate a shard for\n\t * @param state - Current coordinator state containing available shards\n\t * @param strategy - The allocation strategy to use\n\t * @param eligibleShards - Optional filtered list of shards to choose from\n\t * @returns The selected shard binding name\n\t * @throws {CollegeDBError} If no shards are available\n\t * @example\n\t * ```typescript\n\t * const shard = this.selectShard('user-123', state, 'hash');\n\t * // Returns: \"db-west\" (consistent for this key)\n\t * ```\n\t */\n\tprivate selectShard(primaryKey: string, state: ShardCoordinatorState, strategy: ShardingStrategy, eligibleShards?: string[]): string {\n\t\tconst shards = eligibleShards || state.knownShards;\n\n\t\tif (shards.length === 0) {\n\t\t\tthrow new CollegeDBError('No shards available', 'NO_SHARDS');\n\t\t}\n\n\t\tswitch (strategy) {\n\t\t\tcase 'round-robin':\n\t\t\t\treturn shards[state.roundRobinIndex] ?? shards[0]!;\n\t\t\tcase 'random':\n\t\t\t\treturn shards[Math.floor(Math.random() * shards.length)]!;\n\t\t\tcase 'hash': {\n\t\t\t\tlet hash = 0;\n\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\tconst char = primaryKey.charCodeAt(i);\n\t\t\t\t\thash = (hash << 5) - hash + char;\n\t\t\t\t\thash = hash & hash; // Convert to 32-bit integer\n\t\t\t\t}\n\t\t\t\tconst index = Math.abs(hash) % shards.length;\n\t\t\t\treturn shards[index]!;\n\t\t\t}\n\t\t\tcase 'location': {\n\t\t\t\t// If location config missing, fallback to hash\n\t\t\t\tconst region = state.targetRegion;\n\t\t\t\tconst locations = state.shardLocations || {};\n\t\t\t\tconst located = shards.filter((s) => locations[s]);\n\t\t\t\tif (!region || located.length === 0) {\n\t\t\t\t\tlet h = 0;\n\t\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\t\tconst c = primaryKey.charCodeAt(i);\n\t\t\t\t\t\th = (h << 5) - h + c;\n\t\t\t\t\t\th = h & h;\n\t\t\t\t\t}\n\t\t\t\t\tconst idx = Math.abs(h) % shards.length;\n\t\t\t\t\treturn shards[idx]!;\n\t\t\t\t}\n\n\t\t\t\t// Simple location scoring similar to router.ts\n\t\t\t\tconst coords: Record<D1Region, { lat: number; lon: number }> = {\n\t\t\t\t\t// Western North America - San Francisco, CA\n\t\t\t\t\twnam: { lat: 37.7749, lon: -122.4194 },\n\t\t\t\t\t// Eastern North America - Newark, NJ\n\t\t\t\t\tenam: { lat: 40.7357, lon: -74.1724 },\n\t\t\t\t\t// Western Europe - London, UK\n\t\t\t\t\tweur: { lat: 51.5074, lon: -0.1278 },\n\t\t\t\t\t// Eastern Europe - Warsaw, Poland\n\t\t\t\t\teeur: { lat: 52.2297, lon: 21.0122 },\n\t\t\t\t\t// Asia Pacific - Tokyo, Japan\n\t\t\t\t\tapac: { lat: 35.6762, lon: 139.6503 },\n\t\t\t\t\t// Oceania - Sydney, Australia\n\t\t\t\t\toc: { lat: -33.8688, lon: 151.2093 },\n\t\t\t\t\t// Middle East - Dubai, UAE\n\t\t\t\t\tme: { lat: 25.2048, lon: 55.2708 },\n\t\t\t\t\t// Africa - Johannesburg, South Africa\n\t\t\t\t\taf: { lat: -26.2041, lon: 28.0473 }\n\t\t\t\t};\n\n\t\t\t\tconst hasCoordKey = (obj: typeof coords, key: D1Region) => key in obj;\n\t\t\t\tconst getKey = (k: D1Region): keyof typeof coords => (hasCoordKey(coords, k) ? (k as keyof typeof coords) : 'wnam');\n\t\t\t\tconst dist = (from: D1Region, to: D1Region) => {\n\t\t\t\t\tconst a = coords[getKey(from)];\n\t\t\t\t\tconst b = coords[getKey(to)];\n\t\t\t\t\tconst lat = a.lat - b.lat;\n\t\t\t\t\tconst lon = a.lon - b.lon;\n\t\t\t\t\treturn Math.sqrt(lat * lat + lon * lon);\n\t\t\t\t};\n\n\t\t\t\tconst scores = located.map((shard) => {\n\t\t\t\t\tconst meta = locations[shard]!;\n\t\t\t\t\tconst distance = dist(region, meta.region);\n\t\t\t\t\tconst priority = meta.priority || 1;\n\t\t\t\t\treturn { shard, score: distance - priority * 0.1 };\n\t\t\t\t});\n\n\t\t\t\tscores.sort((a, b) => a.score - b.score);\n\t\t\t\tconst bestScore = scores[0]!.score;\n\t\t\t\tconst best = scores.filter((s) => Math.abs(s.score - bestScore) < 0.01);\n\t\t\t\tif (best.length === 1) return best[0]!.shard;\n\n\t\t\t\t// Tie-breaker by consistent hash\n\t\t\t\tlet h2 = 0;\n\t\t\t\tfor (let i = 0; i < primaryKey.length; i++) {\n\t\t\t\t\tconst c = primaryKey.charCodeAt(i);\n\t\t\t\t\th2 = (h2 << 5) - h2 + c;\n\t\t\t\t\th2 = h2 & h2;\n\t\t\t\t}\n\t\t\t\tconst idx2 = Math.abs(h2) % best.length;\n\t\t\t\treturn best[idx2]!.shard;\n\t\t\t}\n\n\t\t\tdefault:\n\t\t\t\treturn shards[0]!;\n\t\t}\n\t}\n\n\t/**\n\t * Atomically increments the key count for a specific shard and updates\n\t * the last modified timestamp. Used when new primary keys are assigned\n\t * to a shard.\n\t * @param shard - The shard binding name to increment\n\t * @returns Promise that resolves when the count is updated\n\t * @throws {Error} If the shard is not known to the coordinator\n\t * @example\n\t * ```typescript\n\t * await coordinator.incrementShardCount('db-east');\n\t * ```\n\t */\n\tasync incrementShardCount(shard: string): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (state.shardStats[shard]) {\n\t\t\tstate.shardStats[shard].count++;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\t}\n\n\t/**\n\t * Atomically decrements the key count for a specific shard and updates\n\t * the last modified timestamp. Used when primary keys are removed or\n\t * moved from a shard. Prevents negative counts.\n\t * @param shard - The shard binding name to decrement\n\t * @returns Promise that resolves when the count is updated\n\t * @throws {CollegeDBError} If the shard is not known to the coordinator\n\t * @example\n\t * ```typescript\n\t * await coordinator.decrementShardCount('db-west');\n\t * ```\n\t */\n\tasync decrementShardCount(shard: string): Promise<void> {\n\t\tconst state = await this.getState();\n\t\tif (state.shardStats[shard] && state.shardStats[shard].count > 0) {\n\t\t\tstate.shardStats[shard].count--;\n\t\t\tstate.shardStats[shard].lastUpdated = Date.now();\n\t\t\tawait this.saveState(state);\n\t\t}\n\t}\n}\n\n//#region Tests - Only run in test environment\nif (process.env.NODE_ENV === 'test' || typeof global !== 'undefined') {\n\t/**\n\t * Mock Durable Object Storage for testing\n\t */\n\tclass MockDurableObjectStorage {\n\t\tprivate data = new Map<string, any>();\n\n\t\tasync get<T = unknown>(key: string): Promise<T | undefined> {\n\t\t\treturn this.data.get(key);\n\t\t}\n\n\t\tasync put<T = unknown>(key: string, value: T): Promise<void> {\n\t\t\tthis.data.set(key, value);\n\t\t}\n\n\t\tasync delete(key: string): Promise<boolean> {\n\t\t\treturn this.data.delete(key);\n\t\t}\n\n\t\tasync deleteAll(): Promise<void> {\n\t\t\tthis.data.clear();\n\t\t}\n\n\t\tasync list(options?: { prefix?: string }): Promise<Map<string, any>> {\n\t\t\tif (!options?.prefix) return new Map(this.data);\n\n\t\t\tconst filtered = new Map();\n\t\t\tfor (const [key, value] of this.data.entries()) {\n\t\t\t\tif (key.startsWith(options.prefix)) {\n\t\t\t\t\tfiltered.set(key, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn filtered;\n\t\t}\n\t}\n\n\t/**\n\t * Mock Durable Object State for testing\n\t */\n\tclass MockDurableObjectState {\n\t\tstorage: MockDurableObjectStorage;\n\n\t\tconstructor() {\n\t\t\tthis.storage = new MockDurableObjectStorage();\n\t\t}\n\t}\n\n\t/**\n\t * Tests for ShardCoordinator class\n\t * These tests verify the core functionality of the ShardCoordinator\n\t * including state management, shard allocation, and HTTP API endpoints\n\t */\n\tclass ShardCoordinatorTests {\n\t\tprivate coordinator: ShardCoordinator;\n\t\tprivate mockState: MockDurableObjectState;\n\n\t\tconstructor() {\n\t\t\tthis.mockState = new MockDurableObjectState();\n\t\t\tthis.coordinator = new ShardCoordinator(this.mockState as any);\n\t\t}\n\n\t\t/**\n\t\t * Test shard allocation strategies\n\t\t */\n\t\tasync testShardAllocation() {\n\t\t\t// Add some shards first\n\t\t\tawait this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/shards', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ shard: 'db-east' })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tawait this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/shards', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ shard: 'db-west' })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// Test round-robin allocation\n\t\t\tconst allocation1 = await this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/allocate', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ primaryKey: 'user-1', strategy: 'round-robin' })\n\t\t\t\t})\n\t\t\t);\n\t\t\tconst result1 = (await allocation1.json()) as { shard: string };\n\n\t\t\tconst allocation2 = await this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/allocate', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ primaryKey: 'user-2', strategy: 'round-robin' })\n\t\t\t\t})\n\t\t\t);\n\t\t\tconst result2 = (await allocation2.json()) as { shard: string };\n\n\t\t\t// Should allocate to different shards with round-robin\n\t\t\tconsole.assert(result1.shard !== result2.shard, 'Round-robin should alternate shards');\n\n\t\t\t// Test hash allocation (should be consistent)\n\t\t\tconst hashAllocation1 = await this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/allocate', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ primaryKey: 'consistent-key', strategy: 'hash' })\n\t\t\t\t})\n\t\t\t);\n\t\t\tconst hashResult1 = (await hashAllocation1.json()) as { shard: string };\n\n\t\t\tconst hashAllocation2 = await this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/allocate', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ primaryKey: 'consistent-key', strategy: 'hash' })\n\t\t\t\t})\n\t\t\t);\n\t\t\tconst hashResult2 = (await hashAllocation2.json()) as { shard: string };\n\n\t\t\t// Hash should be consistent for same key\n\t\t\tconsole.assert(hashResult1.shard === hashResult2.shard, 'Hash allocation should be consistent');\n\n\t\t\tconsole.log('✅ Shard allocation tests passed');\n\t\t}\n\n\t\t/**\n\t\t * Test shard statistics management\n\t\t */\n\t\tasync testShardStats() {\n\t\t\t// Clear state\n\t\t\tawait this.coordinator.fetch(new Request('http://test/flush', { method: 'POST' }));\n\n\t\t\t// Add shard\n\t\t\tawait this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/shards', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ shard: 'db-stats-test' })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// Update stats\n\t\t\tawait this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/stats', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ shard: 'db-stats-test', count: 42 })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// Get stats\n\t\t\tconst statsResponse = await this.coordinator.fetch(new Request('http://test/stats', { method: 'GET' }));\n\t\t\tconst stats = (await statsResponse.json()) as Array<{ binding: string; count: number }>;\n\n\t\t\tconsole.assert(stats.length === 1, 'Should have one shard stat');\n\t\t\tconsole.assert(stats[0]?.binding === 'db-stats-test', 'Should have correct binding name');\n\t\t\tconsole.assert(stats[0]?.count === 42, 'Should have correct count');\n\n\t\t\tconsole.log('✅ Shard stats tests passed');\n\t\t}\n\n\t\t/**\n\t\t * Test error handling\n\t\t */\n\t\tasync testErrorHandling() {\n\t\t\t// Clear state\n\t\t\tawait this.coordinator.fetch(new Request('http://test/flush', { method: 'POST' }));\n\n\t\t\t// Try to allocate with no shards\n\t\t\tconst emptyAllocation = await this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/allocate', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ primaryKey: 'test-key' })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\tconsole.assert(emptyAllocation.status === 400, 'Should return 400 for no shards available');\n\n\t\t\t// Test invalid endpoint\n\t\t\tconst invalidEndpoint = await this.coordinator.fetch(new Request('http://test/invalid', { method: 'GET' }));\n\t\t\tconsole.assert(invalidEndpoint.status === 404, 'Should return 404 for invalid endpoint');\n\n\t\t\tconsole.log('✅ Error handling tests passed');\n\t\t}\n\n\t\t/**\n\t\t * Test the increment/decrement functionality\n\t\t */\n\t\tasync testCountManagement() {\n\t\t\t// Add a shard\n\t\t\tawait this.coordinator.fetch(\n\t\t\t\tnew Request('http://test/shards', {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify({ shard: 'db-count-test' })\n\t\t\t\t})\n\t\t\t);\n\n\t\t\t// Increment count\n\t\t\tawait this.coordinator.incrementShardCount('db-count-test');\n\t\t\tawait this.coordinator.incrementShardCount('db-count-test');\n\n\t\t\t// Check stats\n\t\t\tlet statsResponse = await this.coordinator.fetch(new Request('http://test/stats', { method: 'GET' }));\n\t\t\tlet stats = (await statsResponse.json()) as Array<{ binding: string; count: number }>;\n\n\t\t\tconst shard = stats.find((s) => s.binding === 'db-count-test');\n\t\t\tconsole.assert(shard?.count === 2, 'Count should be 2 after two increments');\n\n\t\t\t// Decrement count\n\t\t\tawait this.coordinator.decrementShardCount('db-count-test');\n\n\t\t\tstatsResponse = await this.coordinator.fetch(new Request('http://test/stats', { method: 'GET' }));\n\t\t\tstats = (await statsResponse.json()) as Array<{ binding: string; count: number }>;\n\n\t\t\tconst updatedShard = stats.find((s) => s.binding === 'db-count-test');\n\t\t\tconsole.assert(updatedShard?.count === 1, 'Count should be 1 after decrement');\n\n\t\t\tconsole.log('✅ Count management tests passed');\n\t\t}\n\n\t\t/**\n\t\t * Run all tests\n\t\t */\n\t\tasync runAllTests() {\n\t\t\tconsole.log('🧪 Running ShardCoordinator tests...');\n\n\t\t\ttry {\n\t\t\t\tawait this.testShardAllocation();\n\t\t\t\tawait this.testShardStats();\n\t\t\t\tawait this.testErrorHandling();\n\t\t\t\tawait this.testCountManagement();\n\n\t\t\t\tconsole.log('🎉 All ShardCoordinator tests passed!');\n\t\t\t\treturn true;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('❌ ShardCoordinator tests failed:', error);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Auto-run tests if this file is executed directly\n\tif (typeof require !== 'undefined' && require.main === module) {\n\t\tconst tests = new ShardCoordinatorTests();\n\t\ttests.runAllTests().then((success) => {\n\t\t\tprocess.exit(success ? 0 : 1);\n\t\t});\n\t}\n\n\t// Export for external testing\n\t(globalThis as any).testShardCoordinator = () => new ShardCoordinatorTests();\n}\n//#endregion\n",
10
10
  "/**\n * CollegeDB - Cloudflare D1 Sharding Router\n *\n * A TypeScript library for horizontal scaling of SQLite-style databases on Cloudflare\n * using D1 and KV. Routes queries to the correct D1 database instance using primary\n * key mappings stored in Cloudflare KV.\n *\n * @author Gregory Mitchell\n * @license MIT\n */\n\n// Export main API functions\nexport {\n\tall,\n\tallAllShards,\n\tallShard,\n\tcollegedb,\n\tcreateSchema,\n\tfirst,\n\tfirstAllShards,\n\tfirstShard,\n\tflush,\n\tgetClosestRegionFromIP,\n\tgetDatabaseSizeForShard,\n\tgetShardStats,\n\tinitialize,\n\tinitializeAsync,\n\tlistKnownShards,\n\tprepare,\n\treassignShard,\n\tresetConfig,\n\trun,\n\trunAllShards,\n\trunShard\n} from './router';\n\n// Export utility classes\nexport { ShardCoordinator } from './durable';\nexport { CollegeDBError } from './errors';\nexport { KVShardMapper } from './kvmap';\n\n// Export provider adapters\nexport {\n\tcreateDrizzleSQLProvider,\n\tcreateHyperdriveMySQLProvider,\n\tcreateHyperdrivePostgresProvider,\n\tcreateMySQLProvider,\n\tcreateNuxtHubKVProvider,\n\tcreatePostgreSQLProvider,\n\tcreateRedisKVProvider,\n\tcreateSQLiteProvider,\n\tcreateValkeyKVProvider,\n\tisKVStorage,\n\tisSQLDatabase,\n\ttype DrizzleClientLike,\n\ttype DrizzleSqlChunkLike,\n\ttype DrizzleSqlTagLike,\n\ttype HyperdriveBindingLike,\n\ttype HyperdriveMySQLClientFactory,\n\ttype HyperdrivePostgresClientFactory,\n\ttype MySQLClientLike,\n\ttype NuxtHubKVLike,\n\ttype PostgresClientLike,\n\ttype RedisLikeClient,\n\ttype SQLiteClientLike\n} from './providers';\n\n// Export migration functions\nexport {\n\tautoDetectAndMigrate,\n\tcheckMigrationNeeded,\n\tclearMigrationCache,\n\tclearShardMigrationCache,\n\tcreateMappingsForExistingKeys,\n\tcreateSchemaAcrossShards,\n\tdiscoverExistingPrimaryKeys,\n\tdiscoverExistingRecordsWithColumns,\n\tdropSchema,\n\tintegrateExistingDatabase,\n\tlistTables,\n\tmigrateRecord,\n\tschemaExists,\n\tvalidateTableForSharding,\n\ttype IntegrationOptions,\n\ttype IntegrationResult,\n\ttype ValidationResult\n} from './migrations';\n\n// Export types\nexport type {\n\tCollegeDBConfig,\n\tD1Region,\n\tEnv,\n\tKVListResult,\n\tKVStorage,\n\tMixedShardingStrategy,\n\tOperationType,\n\tPreparedStatement,\n\tQueryResult,\n\tQueryResultMeta,\n\tSQLDatabase,\n\tShardCoordinatorState,\n\tShardLocation,\n\tShardMapping,\n\tShardStats,\n\tShardingStrategy\n} from './types';\n",
11
- "/**\n * @fileoverview Provider adapters for non-Cloudflare backends.\n *\n * This module defines maintainable adapter factories that allow CollegeDB to run\n * on multiple storage backends while preserving Cloudflare compatibility.\n *\n * Supported KV backends:\n * - Cloudflare KV (native shape)\n * - Redis\n * - Valkey\n * - NuxtHub KV / Unstorage-compatible clients\n *\n * Supported SQL backends:\n * - Cloudflare D1 (native shape)\n * - PostgreSQL compatible clients\n * - MySQL / MariaDB compatible clients\n * - SQLite clients\n * - Drizzle ORM database instances\n * - Hyperdrive-backed PostgreSQL / MySQL clients\n *\n * @author CollegeDB Team\n * @since 1.1.0\n */\n\nimport { CollegeDBError } from './errors';\nimport type { KVListResult, KVStorage, PreparedStatement, QueryResult, QueryResultMeta, SQLDatabase } from './types';\n\nconst DEFAULT_REDIS_SCAN_COUNT = 500;\n\n/**\n * Minimal Redis/Valkey client contract used by the KV adapter.\n */\nexport interface RedisLikeClient {\n\tget(key: string): Promise<string | null>;\n\tset(key: string, value: string): Promise<unknown>;\n\tdel(key: string): Promise<unknown>;\n\tscan(cursor: string, ...args: any[]): Promise<RedisScanResult>;\n}\n\n/**\n * Redis/Valkey SCAN response in ioredis tuple form.\n */\nexport type RedisScanTupleResult = [string, string[]];\n\n/**\n * Redis/Valkey SCAN response in node-redis object form.\n */\nexport interface RedisScanObjectResult {\n\tcursor: string | number;\n\tkeys: string[];\n}\n\n/**\n * Accepted SCAN response formats.\n */\nexport type RedisScanResult = RedisScanTupleResult | RedisScanObjectResult;\n\n/**\n * PostgreSQL result shape used by adapters.\n */\nexport interface PostgresQueryResult<T = Record<string, unknown>> {\n\trows: T[];\n\trowCount?: number | null;\n\tcommand?: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal PostgreSQL client contract used by the SQL adapter.\n */\nexport interface PostgresClientLike {\n\tquery<T = Record<string, unknown>>(sql: string, bindings?: any[]): Promise<PostgresQueryResult<T>>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface PostgresLifecycleClientLike extends PostgresClientLike {\n\tconnect?: () => Promise<void>;\n\tend?: () => Promise<void>;\n\trelease?: () => void;\n}\n\n/**\n * MySQL/MariaDB OK packet shape.\n */\nexport interface MySQLOkPacket {\n\taffectedRows?: number;\n\tinsertId?: number;\n\twarningStatus?: number;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal MySQL/MariaDB client contract used by adapters.\n */\nexport interface MySQLClientLike {\n\texecute?: (sql: string, bindings?: any[]) => Promise<[unknown, unknown]>;\n\tquery?: (sql: string, bindings?: any[]) => Promise<[unknown, unknown]>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface MySQLLifecycleClientLike extends MySQLClientLike {\n\tend?: () => Promise<void>;\n\tclose?: () => Promise<void>;\n\tdestroy?: () => void;\n}\n\n/**\n * Statement contract for SQLite adapters.\n */\nexport interface SQLiteStatementLike {\n\trun?: (...bindings: any[]) => unknown | Promise<unknown>;\n\tall?: (...bindings: any[]) => unknown[] | Promise<unknown[]>;\n\tget?: (...bindings: any[]) => unknown | Promise<unknown>;\n}\n\n/**\n * Minimal SQLite client contract used by adapters.\n */\nexport interface SQLiteClientLike {\n\tprepare?: (sql: string) => SQLiteStatementLike;\n\texecute?: (sql: string, bindings?: any[]) => Promise<unknown>;\n}\n\n/**\n * Hyperdrive binding shape used by helper factories.\n */\nexport interface HyperdriveBindingLike {\n\tconnectionString: string;\n\tlocalConnectionString?: string;\n}\n\n/**\n * Factory for creating PostgreSQL clients from a Hyperdrive connection string.\n */\nexport type HyperdrivePostgresClientFactory = (connectionString: string) => PostgresLifecycleClientLike;\n\n/**\n * Factory for creating MySQL clients from a Hyperdrive connection string.\n */\nexport type HyperdriveMySQLClientFactory = (connectionString: string) => MySQLLifecycleClientLike;\n\n/**\n * Minimal SQL chunk contract produced by Drizzle's `sql` helper.\n */\nexport interface DrizzleSqlChunkLike {\n\tappend(chunk: DrizzleSqlChunkLike): void;\n}\n\n/**\n * Minimal Drizzle `sql` tag contract used to build parameterized raw statements.\n */\nexport interface DrizzleSqlTagLike {\n\t(strings: TemplateStringsArray, ...params: any[]): DrizzleSqlChunkLike;\n\traw(sql: string): DrizzleSqlChunkLike;\n\tempty?: () => DrizzleSqlChunkLike;\n}\n\n/**\n * Minimal Drizzle database contract used by the SQL adapter.\n */\nexport interface DrizzleClientLike {\n\texecute?: (query: unknown) => Promise<unknown>;\n\trun?: (query: unknown) => Promise<unknown>;\n\tall?: (query: unknown) => Promise<unknown>;\n\tget?: (query: unknown) => Promise<unknown>;\n}\n\n/**\n * NuxtHub/Unstorage-like KV contract used by the adapter.\n */\nexport interface NuxtHubKVLike {\n\tget?<T = unknown>(key: string): Promise<T | null | undefined>;\n\tset?(key: string, value: unknown, options?: { ttl?: number }): Promise<unknown>;\n\tdel?(key: string): Promise<unknown>;\n\tkeys?(prefix?: string): Promise<string[]>;\n\tgetItem?<T = unknown>(key: string): Promise<T | null | undefined>;\n\tsetItem?(key: string, value: unknown): Promise<unknown>;\n\tremoveItem?(key: string): Promise<unknown>;\n\tgetKeys?(prefix?: string): Promise<string[]>;\n}\n\n/**\n * Creates a Redis-backed KV provider adapter.\n *\n * The adapter supports both node-redis and ioredis scan formats.\n *\n * @param client - Redis/Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createRedisKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\tconst scanCount = options.scanCount ?? DEFAULT_REDIS_SCAN_COUNT;\n\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await client.get(key);\n\t\t\tif (raw === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type !== 'json') {\n\t\t\t\treturn raw;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t`Failed to parse JSON from Redis for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait client.set(key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait client.del(key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst pattern = `${prefix}*`;\n\t\t\tlet cursor = options?.cursor ?? '0';\n\t\t\tconst limit = options?.limit;\n\t\t\tconst keys: string[] = [];\n\n\t\t\tdo {\n\t\t\t\tconst scanResult = await executeRedisScan(client, cursor, pattern, scanCount);\n\t\t\t\tcursor = scanResult.cursor;\n\n\t\t\t\tfor (const key of scanResult.keys) {\n\t\t\t\t\tif (!prefix || key.startsWith(prefix)) {\n\t\t\t\t\t\tkeys.push(key);\n\t\t\t\t\t}\n\t\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (cursor !== '0');\n\n\t\t\treturn {\n\t\t\t\tkeys: keys.map((name) => ({ name })),\n\t\t\t\tcursor,\n\t\t\t\tlist_complete: cursor === '0'\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a Valkey-backed KV provider adapter.\n *\n * Valkey and Redis have compatible command surfaces for this adapter.\n *\n * @param client - Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createValkeyKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\treturn createRedisKVProvider(client, options);\n}\n\n/**\n * Creates a PostgreSQL adapter implementing CollegeDB's SQL contract.\n *\n * Supports `pg` Client, Pool, and compatible implementations.\n * SQL using `?` placeholders is automatically rewritten to `$1..$n`.\n *\n * For Drizzle-backed PostgreSQL clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - PostgreSQL client/pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createPostgreSQLProvider(client: PostgresClientLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: PostgresClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new PostgresPreparedStatement(client as PostgresClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a MySQL/MariaDB adapter implementing CollegeDB's SQL contract.\n *\n * Supports mysql2/promise clients, pools, and compatible wrappers.\n *\n * For Drizzle-backed MySQL/MariaDB clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - MySQL/MariaDB client or pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createMySQLProvider(client: MySQLClientLike): SQLDatabase;\nexport function createMySQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createMySQLProvider(client: MySQLClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new MySQLPreparedStatement(client as MySQLClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a SQLite adapter implementing CollegeDB's SQL contract.\n *\n * Supports both execute-style clients and prepare/run/get/all statement clients.\n *\n * For Drizzle-backed SQLite/D1 clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - SQLite client\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createSQLiteProvider(client: SQLiteClientLike): SQLDatabase;\nexport function createSQLiteProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createSQLiteProvider(client: SQLiteClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new SQLitePreparedStatement(client as SQLiteClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a Drizzle-backed SQL adapter implementing CollegeDB's SQL contract.\n *\n * This adapter enables using Drizzle database instances (including NuxtHub's\n * `db` from `@nuxthub/db` or `hub:db`) as shard providers while CollegeDB keeps\n * query routing and key->shard mapping responsibilities.\n *\n * @param client - Drizzle database instance\n * @param sqlTag - Drizzle `sql` helper from `drizzle-orm`\n * @returns SQLDatabase-compatible adapter\n */\nexport function createDrizzleSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase {\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new DrizzlePreparedStatement(client, sqlTag, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a NuxtHub KV adapter implementing CollegeDB's KV contract.\n *\n * Supports both `@nuxthub/kv` (`get/set/del/keys`) and unstorage-like\n * implementations (`getItem/setItem/removeItem/getKeys`).\n *\n * @param client - NuxtHub KV/Unstorage-like client\n * @returns KVStorage-compatible adapter\n */\nexport function createNuxtHubKVProvider(client: NuxtHubKVLike): KVStorage {\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await getNuxtHubKVValue(client, key);\n\t\t\tif (raw === null || raw === undefined) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type === 'json') {\n\t\t\t\tif (typeof raw === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t\t\t`Failed to parse JSON from NuxtHub KV for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn raw as T;\n\t\t\t}\n\n\t\t\treturn typeof raw === 'string' ? raw : JSON.stringify(raw);\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait setNuxtHubKVValue(client, key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait deleteNuxtHubKVValue(client, key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst allKeys = await listNuxtHubKVKeys(client, prefix);\n\t\t\tconst limitedKeys = typeof options?.limit === 'number' ? allKeys.slice(0, options.limit) : allKeys;\n\n\t\t\treturn {\n\t\t\t\tkeys: limitedKeys.map((name) => ({ name })),\n\t\t\t\tlist_complete: true\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a PostgreSQL adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling at the edge, so this pattern remains fast\n * and scalable in Workers.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => new Client({ connectionString })`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdrivePostgresProvider(\n\thyperdrive: HyperdriveBindingLike,\n\tclientFactory: HyperdrivePostgresClientFactory\n): SQLDatabase {\n\tconst delegatedClient: PostgresClientLike = {\n\t\tquery: async <T = Record<string, unknown>>(sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\tif (typeof client.connect === 'function') {\n\t\t\t\tawait client.connect();\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn await client.query<T>(sql, bindings);\n\t\t\t} finally {\n\t\t\t\tif (typeof client.release === 'function') {\n\t\t\t\t\tclient.release();\n\t\t\t\t} else if (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createPostgreSQLProvider(delegatedClient);\n}\n\n/**\n * Creates a MySQL/MariaDB adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling under the hood.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => mysql.createConnection(connectionString)`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdriveMySQLProvider(hyperdrive: HyperdriveBindingLike, clientFactory: HyperdriveMySQLClientFactory): SQLDatabase {\n\tconst delegatedClient: MySQLClientLike = {\n\t\texecute: async (sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\ttry {\n\t\t\t\tif (typeof client.execute === 'function') {\n\t\t\t\t\treturn await client.execute(sql, bindings);\n\t\t\t\t}\n\t\t\t\tif (typeof client.query === 'function') {\n\t\t\t\t\treturn await client.query(sql, bindings);\n\t\t\t\t}\n\n\t\t\t\tthrow new CollegeDBError('Hyperdrive MySQL client is missing execute/query methods', 'MYSQL_CLIENT_INVALID');\n\t\t\t} finally {\n\t\t\t\tif (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t} else if (typeof client.close === 'function') {\n\t\t\t\t\tawait client.close();\n\t\t\t\t} else if (typeof client.destroy === 'function') {\n\t\t\t\t\tclient.destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createMySQLProvider(delegatedClient);\n}\n\n/**\n * Returns `true` when a value looks like an SQL database provider.\n */\nexport function isSQLDatabase(value: unknown): value is SQLDatabase {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\treturn typeof (value as SQLDatabase).prepare === 'function';\n}\n\n/**\n * Returns `true` when a value looks like a KV storage provider.\n */\nexport function isKVStorage(value: unknown): value is KVStorage {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tconst kv = value as KVStorage;\n\treturn typeof kv.get === 'function' && typeof kv.put === 'function' && typeof kv.delete === 'function' && typeof kv.list === 'function';\n}\n\nclass PostgresPreparedStatement implements PreparedStatement {\n\tprivate readonly client: PostgresClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: PostgresClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new PostgresPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn result.rows?.[0] ?? null;\n\t}\n}\n\nclass MySQLPreparedStatement implements PreparedStatement {\n\tprivate readonly client: MySQLClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: MySQLClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new MySQLPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\n\t\tif (Array.isArray(rows)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows as T[],\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst packet = rows as MySQLOkPacket;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: packet.affectedRows,\n\t\t\t\tlast_row_id: packet.insertId,\n\t\t\t\twarningStatus: packet.warningStatus\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: Array.isArray(rows) ? (rows as T[]) : [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: !Array.isArray(rows) ? (rows as MySQLOkPacket).affectedRows : undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn rows[0] as T;\n\t}\n}\n\nclass SQLitePreparedStatement implements PreparedStatement {\n\tprivate readonly client: SQLiteClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: SQLiteClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new SQLitePreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows,\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.run !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().run()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst runResult = await statement.run(...this.bindings);\n\t\tconst runMeta = (runResult ?? {}) as Record<string, unknown>;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: toMaybeNumber(runMeta.changes),\n\t\t\t\tlast_row_id: (runMeta.lastInsertRowid ?? runMeta.lastID) as number | string | undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: extractRowsFromSQLiteExecute<T>(result),\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.all !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().all()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst rows = await statement.all(...this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: (Array.isArray(rows) ? rows : []) as T[],\n\t\t\tmeta: createMeta(startedAt)\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement) {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().get()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tif (typeof statement.get === 'function') {\n\t\t\tconst row = await statement.get(...this.bindings);\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (typeof statement.all === 'function') {\n\t\t\tconst rows = await statement.all(...this.bindings);\n\t\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst firstRow = rows[0];\n\t\t\treturn firstRow === undefined || firstRow === null ? null : (firstRow as T);\n\t\t}\n\n\t\tthrow new CollegeDBError('SQLite prepare() result must expose get() or all()', 'SQLITE_CLIENT_INVALID');\n\t}\n}\n\nclass DrizzlePreparedStatement implements PreparedStatement {\n\tprivate readonly client: DrizzleClientLike;\n\tprivate readonly sqlTag: DrizzleSqlTagLike;\n\tprivate readonly sqlText: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sqlTag = sqlTag;\n\t\tthis.sqlText = sqlText;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new DrizzlePreparedStatement(this.client, this.sqlTag, this.sqlText, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleRun(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleAll(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleFirst(this.client, query);\n\t\tconst rows = extractRowsFromDrizzleExecute<T>(result);\n\t\tif (rows.length > 0) {\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tif (result && typeof result === 'object' && 'row' in result) {\n\t\t\tconst row = (result as Record<string, unknown>).row;\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === 'object' &&\n\t\t\t!Array.isArray(result) &&\n\t\t\t!('rows' in result) &&\n\t\t\t!('results' in result) &&\n\t\t\t!('data' in result)\n\t\t) {\n\t\t\treturn result as T;\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nasync function executeRedisScan(\n\tclient: RedisLikeClient,\n\tcursor: string,\n\tpattern: string,\n\tscanCount: number\n): Promise<{ cursor: string; keys: string[] }> {\n\ttry {\n\t\tconst objectResult = await client.scan(cursor, { MATCH: pattern, COUNT: scanCount });\n\t\treturn normalizeRedisScanResult(objectResult);\n\t} catch {\n\t\tconst tupleResult = await client.scan(cursor, 'MATCH', pattern, 'COUNT', String(scanCount));\n\t\treturn normalizeRedisScanResult(tupleResult);\n\t}\n}\n\nfunction normalizeRedisScanResult(result: RedisScanResult): { cursor: string; keys: string[] } {\n\tif (Array.isArray(result)) {\n\t\treturn {\n\t\t\tcursor: String(result[0] ?? '0'),\n\t\t\tkeys: Array.isArray(result[1]) ? result[1] : []\n\t\t};\n\t}\n\n\treturn {\n\t\tcursor: String(result.cursor ?? '0'),\n\t\tkeys: Array.isArray(result.keys) ? result.keys : []\n\t};\n}\n\nasync function executeMySQL(client: MySQLClientLike, sql: string, bindings: any[]): Promise<unknown> {\n\tif (typeof client.execute === 'function') {\n\t\tconst [rows] = await client.execute(sql, bindings);\n\t\treturn rows;\n\t}\n\n\tif (typeof client.query === 'function') {\n\t\tconst [rows] = await client.query(sql, bindings);\n\t\treturn rows;\n\t}\n\n\tthrow new CollegeDBError('MySQL client must expose execute() or query()', 'MYSQL_CLIENT_INVALID');\n}\n\nasync function executeDrizzleRun(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose run(), execute(), or all()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleAll(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose all(), execute(), or run()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleFirst(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get(query);\n\t}\n\n\treturn await executeDrizzleAll(client, query);\n}\n\nfunction buildDrizzleQuery(sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[]): DrizzleSqlChunkLike {\n\tconst segments = splitQuestionPlaceholders(sqlText);\n\tconst placeholderCount = segments.length - 1;\n\n\tif (placeholderCount !== bindings.length) {\n\t\tthrow new CollegeDBError(\n\t\t\t`Drizzle binding mismatch: expected ${placeholderCount} bindings, received ${bindings.length}`,\n\t\t\t'DRIZZLE_BINDINGS_MISMATCH'\n\t\t);\n\t}\n\n\tif (placeholderCount === 0) {\n\t\treturn sqlTag.raw(sqlText);\n\t}\n\n\tconst statement = typeof sqlTag.empty === 'function' ? sqlTag.empty() : sqlTag.raw('');\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment) {\n\t\t\tstatement.append(sqlTag.raw(segment));\n\t\t}\n\n\t\tif (i < placeholderCount) {\n\t\t\tstatement.append(sqlTag`${bindings[i]}`);\n\t\t}\n\t}\n\n\treturn statement;\n}\n\nfunction splitQuestionPlaceholders(sql: string): string[] {\n\tconst segments: string[] = [];\n\tlet segmentStart = 0;\n\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tif (inSingleQuote && next === \"'\") {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tif (inDoubleQuote && next === '\"') {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tsegments.push(sql.slice(segmentStart, i));\n\t\t\tsegmentStart = i + 1;\n\t\t}\n\t}\n\n\tsegments.push(sql.slice(segmentStart));\n\treturn segments;\n}\n\nfunction extractRowsFromDrizzleExecute<T>(result: unknown): T[] {\n\tif (Array.isArray(result)) {\n\t\tif (result.length === 2 && Array.isArray(result[0])) {\n\t\t\treturn result[0] as T[];\n\t\t}\n\n\t\tif (\n\t\t\tresult.length === 2 &&\n\t\t\tresult[0] &&\n\t\t\ttypeof result[0] === 'object' &&\n\t\t\t!Array.isArray(result[0]) &&\n\t\t\t(Array.isArray(result[1]) || result[1] === null || result[1] === undefined)\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectResult = result as Record<string, unknown>;\n\n\t\tif (Array.isArray(objectResult.rows)) {\n\t\t\treturn objectResult.rows as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectResult.results)) {\n\t\t\treturn objectResult.results as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectResult.data)) {\n\t\t\treturn objectResult.data as T[];\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction extractMetaFromDrizzleExecute(result: unknown): Record<string, unknown> {\n\tif (!result) {\n\t\treturn {};\n\t}\n\n\tlet objectResult: Record<string, unknown> | undefined;\n\n\tif (Array.isArray(result) && result.length === 2 && result[0] && typeof result[0] === 'object' && !Array.isArray(result[0])) {\n\t\tobjectResult = result[0] as Record<string, unknown>;\n\t} else if (typeof result === 'object' && !Array.isArray(result)) {\n\t\tobjectResult = result as Record<string, unknown>;\n\t}\n\n\tif (!objectResult) {\n\t\treturn {};\n\t}\n\n\tconst meta: Record<string, unknown> = {};\n\n\tconst changes = toMaybeNumber(objectResult.rowCount) ?? toMaybeNumber(objectResult.changes) ?? toMaybeNumber(objectResult.affectedRows);\n\tif (changes !== undefined) {\n\t\tmeta.changes = changes;\n\t}\n\n\tconst lastRowId = objectResult.lastInsertRowid ?? objectResult.lastInsertId ?? objectResult.insertId;\n\tif (typeof lastRowId === 'number' || typeof lastRowId === 'string') {\n\t\tmeta.last_row_id = lastRowId;\n\t}\n\n\tif (objectResult.meta && typeof objectResult.meta === 'object') {\n\t\tObject.assign(meta, objectResult.meta as Record<string, unknown>);\n\t}\n\n\treturn meta;\n}\n\nasync function getNuxtHubKVValue<T = unknown>(client: NuxtHubKVLike, key: string): Promise<T | null | undefined> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get<T>(key);\n\t}\n\n\tif (typeof client.getItem === 'function') {\n\t\treturn await client.getItem<T>(key);\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose get() or getItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function setNuxtHubKVValue(client: NuxtHubKVLike, key: string, value: string): Promise<void> {\n\tif (typeof client.set === 'function') {\n\t\tawait client.set(key, value);\n\t\treturn;\n\t}\n\n\tif (typeof client.setItem === 'function') {\n\t\tawait client.setItem(key, value);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose set() or setItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function deleteNuxtHubKVValue(client: NuxtHubKVLike, key: string): Promise<void> {\n\tif (typeof client.del === 'function') {\n\t\tawait client.del(key);\n\t\treturn;\n\t}\n\n\tif (typeof client.removeItem === 'function') {\n\t\tawait client.removeItem(key);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose del() or removeItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function listNuxtHubKVKeys(client: NuxtHubKVLike, prefix: string): Promise<string[]> {\n\tlet keys: string[];\n\n\tif (typeof client.keys === 'function') {\n\t\tkeys = await client.keys(prefix);\n\t} else if (typeof client.getKeys === 'function') {\n\t\tkeys = await client.getKeys(prefix);\n\t} else {\n\t\tthrow new CollegeDBError('NuxtHub KV client must expose keys() or getKeys()', 'NUXTHUB_KV_CLIENT_INVALID');\n\t}\n\n\tif (!Array.isArray(keys)) {\n\t\treturn [];\n\t}\n\n\tif (!prefix) {\n\t\treturn keys;\n\t}\n\n\treturn keys.filter((key) => key.startsWith(prefix));\n}\n\nfunction extractRowsFromSQLiteExecute<T>(result: unknown): T[] {\n\tif (Array.isArray(result)) {\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectResult = result as Record<string, unknown>;\n\n\t\tif (Array.isArray(objectResult.rows)) {\n\t\t\treturn objectResult.rows as T[];\n\t\t}\n\t\tif (Array.isArray(objectResult.results)) {\n\t\t\treturn objectResult.results as T[];\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction createMeta(startedAt: number, extra: Record<string, unknown> = {}): QueryResultMeta {\n\treturn {\n\t\tduration: Date.now() - startedAt,\n\t\t...extra\n\t};\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) {\n\t\treturn value;\n\t}\n\treturn undefined;\n}\n\nconst postgresPlaceholderCache = new Map<string, string>();\n\nfunction rewriteQuestionPlaceholders(sql: string): string {\n\tconst cached = postgresPlaceholderCache.get(sql);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tlet output = '';\n\tlet placeholderIndex = 0;\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\toutput += '/';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\toutput += '--';\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\toutput += '/*';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tplaceholderIndex++;\n\t\t\toutput += `$${placeholderIndex}`;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += char;\n\t}\n\n\tpostgresPlaceholderCache.set(sql, output);\n\tif (postgresPlaceholderCache.size > 5000) {\n\t\tconst firstKey = postgresPlaceholderCache.keys().next().value;\n\t\tif (firstKey) {\n\t\t\tpostgresPlaceholderCache.delete(firstKey);\n\t\t}\n\t}\n\n\treturn output;\n}\n"
11
+ "/**\n * @fileoverview Provider adapters for non-Cloudflare backends.\n *\n * This module defines maintainable adapter factories that allow CollegeDB to run\n * on multiple storage backends while preserving Cloudflare compatibility.\n *\n * Supported KV backends:\n * - Cloudflare KV (native shape)\n * - Redis\n * - Valkey\n * - NuxtHub KV / Unstorage-compatible clients\n *\n * Supported SQL backends:\n * - Cloudflare D1 (native shape)\n * - PostgreSQL compatible clients\n * - MySQL / MariaDB compatible clients\n * - SQLite clients\n * - Drizzle ORM database instances\n * - Hyperdrive-backed PostgreSQL / MySQL clients\n *\n * @author CollegeDB Team\n * @since 1.1.0\n */\n\nimport { CollegeDBError } from './errors';\nimport type { KVListResult, KVStorage, PreparedStatement, QueryResult, QueryResultMeta, SQLDatabase } from './types';\n\nconst DEFAULT_REDIS_SCAN_COUNT = 500;\n\n/**\n * Minimal Redis/Valkey client contract used by the KV adapter.\n */\nexport interface RedisLikeClient {\n\tget(key: string): Promise<string | null>;\n\tset(key: string, value: string): unknown | Promise<unknown>;\n\tdel(key: string): unknown | Promise<unknown>;\n\tscan(cursor: string, ...args: any[]): RedisScanResult | Promise<RedisScanResult>;\n}\n\n/**\n * Redis/Valkey SCAN response in ioredis tuple form.\n */\nexport type RedisScanTupleResult = [string, string[]];\n\n/**\n * Redis/Valkey SCAN response in node-redis object form.\n */\nexport interface RedisScanObjectResult {\n\tcursor: string | number;\n\tkeys: string[];\n}\n\n/**\n * Accepted SCAN response formats.\n */\nexport type RedisScanResult = RedisScanTupleResult | RedisScanObjectResult;\n\n/**\n * PostgreSQL result shape used by adapters.\n */\nexport interface PostgresQueryResult<T = Record<string, unknown>> {\n\trows: T[];\n\trowCount?: number | null;\n\tcommand?: string;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal PostgreSQL client contract used by the SQL adapter.\n */\nexport interface PostgresClientLike {\n\tquery<T = Record<string, unknown>>(sql: string, bindings?: any[]): Promise<PostgresQueryResult<T>>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface PostgresLifecycleClientLike extends PostgresClientLike {\n\tconnect?: () => void | Promise<void>;\n\tend?: () => void | Promise<void>;\n\trelease?: () => void;\n}\n\n/**\n * MySQL/MariaDB OK packet shape.\n */\nexport interface MySQLOkPacket {\n\taffectedRows?: number;\n\tinsertId?: number;\n\twarningStatus?: number;\n\t[key: string]: unknown;\n}\n\n/**\n * Minimal MySQL/MariaDB client contract used by adapters.\n */\nexport interface MySQLClientLike {\n\texecute?: (sql: string, bindings?: any[]) => any | Promise<any>;\n\tquery?: (sql: string, bindings?: any[]) => any | Promise<any>;\n}\n\n/**\n * Optional lifecycle methods used by Hyperdrive helpers.\n */\nexport interface MySQLLifecycleClientLike extends MySQLClientLike {\n\tend?: () => void | Promise<void>;\n\tclose?: () => void | Promise<void>;\n\tdestroy?: () => void;\n}\n\n/**\n * Statement contract for SQLite adapters.\n */\nexport interface SQLiteStatementLike {\n\trun?: (...bindings: any[]) => unknown | Promise<unknown>;\n\tall?: (...bindings: any[]) => unknown[] | Promise<unknown[]>;\n\tget?: (...bindings: any[]) => unknown | Promise<unknown>;\n}\n\n/**\n * Minimal SQLite client contract used by adapters.\n */\nexport interface SQLiteClientLike {\n\tprepare?: (sql: string) => SQLiteStatementLike;\n\texecute?: (sql: string, bindings?: any[]) => any | Promise<any>;\n}\n\n/**\n * Hyperdrive binding shape used by helper factories.\n */\nexport interface HyperdriveBindingLike {\n\tconnectionString: string;\n\tlocalConnectionString?: string;\n}\n\n/**\n * Factory for creating PostgreSQL clients from a Hyperdrive connection string.\n */\nexport type HyperdrivePostgresClientFactory = (connectionString: string) => PostgresLifecycleClientLike;\n\n/**\n * Factory for creating MySQL clients from a Hyperdrive connection string.\n */\nexport type HyperdriveMySQLClientFactory = (connectionString: string) => MySQLLifecycleClientLike;\n\n/**\n * Minimal SQL chunk contract produced by Drizzle's `sql` helper.\n */\nexport interface DrizzleSqlChunkLike {\n\tappend(chunk: DrizzleSqlChunkLike): void;\n}\n\n/**\n * Minimal Drizzle `sql` tag contract used to build parameterized raw statements.\n */\nexport interface DrizzleSqlTagLike {\n\t(strings: TemplateStringsArray, ...params: any[]): DrizzleSqlChunkLike;\n\traw(sql: string): DrizzleSqlChunkLike;\n\tempty?: () => DrizzleSqlChunkLike;\n}\n\n/**\n * Minimal Drizzle database contract used by the SQL adapter.\n */\nexport interface DrizzleClientLike {\n\texecute?: (query: any) => any | Promise<any>;\n\trun?: (query: any) => any | Promise<any>;\n\tall?: (query: any) => any | Promise<any>;\n\tget?: (query: any) => any | Promise<any>;\n}\n\n/**\n * NuxtHub/Unstorage-like KV contract used by the adapter.\n */\nexport interface NuxtHubKVLike {\n\tget?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;\n\tset?(key: string, value: any, options?: { ttl?: number }): any | Promise<any>;\n\tdel?(key: string): any | Promise<any>;\n\tkeys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;\n\tgetItem?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;\n\tsetItem?(key: string, value: any): any | Promise<any>;\n\tremoveItem?(key: string): any | Promise<any>;\n\tgetKeys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;\n}\n\n/**\n * Creates a Redis-backed KV provider adapter.\n *\n * The adapter supports both node-redis and ioredis scan formats.\n *\n * @param client - Redis/Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createRedisKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\tconst scanCount = options.scanCount ?? DEFAULT_REDIS_SCAN_COUNT;\n\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await client.get(key);\n\t\t\tif (raw === null) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type !== 'json') {\n\t\t\t\treturn raw;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t} catch (error) {\n\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t`Failed to parse JSON from Redis for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait client.set(key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait client.del(key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst pattern = `${prefix}*`;\n\t\t\tlet cursor = options?.cursor ?? '0';\n\t\t\tconst limit = options?.limit;\n\t\t\tconst keys: string[] = [];\n\n\t\t\tdo {\n\t\t\t\tconst scanResult = await executeRedisScan(client, cursor, pattern, scanCount);\n\t\t\t\tcursor = scanResult.cursor;\n\n\t\t\t\tfor (const key of scanResult.keys) {\n\t\t\t\t\tif (!prefix || key.startsWith(prefix)) {\n\t\t\t\t\t\tkeys.push(key);\n\t\t\t\t\t}\n\t\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (limit && keys.length >= limit) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} while (cursor !== '0');\n\n\t\t\treturn {\n\t\t\t\tkeys: keys.map((name) => ({ name })),\n\t\t\t\tcursor,\n\t\t\t\tlist_complete: cursor === '0'\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a Valkey-backed KV provider adapter.\n *\n * Valkey and Redis have compatible command surfaces for this adapter.\n *\n * @param client - Valkey client\n * @param options - Adapter tuning options\n * @returns KVStorage-compatible adapter\n */\nexport function createValkeyKVProvider(client: RedisLikeClient, options: { scanCount?: number } = {}): KVStorage {\n\treturn createRedisKVProvider(client, options);\n}\n\n/**\n * Creates a PostgreSQL adapter implementing CollegeDB's SQL contract.\n *\n * Supports `pg` Client, Pool, and compatible implementations.\n * SQL using `?` placeholders is automatically rewritten to `$1..$n`.\n *\n * For Drizzle-backed PostgreSQL clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - PostgreSQL client/pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createPostgreSQLProvider(client: PostgresClientLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createPostgreSQLProvider(client: PostgresClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new PostgresPreparedStatement(client as PostgresClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a MySQL/MariaDB adapter implementing CollegeDB's SQL contract.\n *\n * Supports mysql2/promise clients, pools, and compatible wrappers.\n *\n * For Drizzle-backed MySQL/MariaDB clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - MySQL/MariaDB client or pool\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createMySQLProvider(client: MySQLClientLike): SQLDatabase;\nexport function createMySQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createMySQLProvider(client: MySQLClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new MySQLPreparedStatement(client as MySQLClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a SQLite adapter implementing CollegeDB's SQL contract.\n *\n * Supports both execute-style clients and prepare/run/get/all statement clients.\n *\n * For Drizzle-backed SQLite/D1 clients, pass the Drizzle DB instance as\n * `client` and the Drizzle `sql` helper as the second argument.\n *\n * @param client - SQLite client\n * @param sqlTag - Optional Drizzle `sql` helper for Drizzle interop\n * @returns SQLDatabase-compatible adapter\n */\nexport function createSQLiteProvider(client: SQLiteClientLike): SQLDatabase;\nexport function createSQLiteProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase;\nexport function createSQLiteProvider(client: SQLiteClientLike | DrizzleClientLike, sqlTag?: DrizzleSqlTagLike): SQLDatabase {\n\tif (sqlTag) {\n\t\treturn createDrizzleSQLProvider(client as DrizzleClientLike, sqlTag);\n\t}\n\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new SQLitePreparedStatement(client as SQLiteClientLike, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a Drizzle-backed SQL adapter implementing CollegeDB's SQL contract.\n *\n * This adapter enables using Drizzle database instances (including NuxtHub's\n * `db` from `@nuxthub/db` or `hub:db`) as shard providers while CollegeDB keeps\n * query routing and key->shard mapping responsibilities.\n *\n * @param client - Drizzle database instance\n * @param sqlTag - Drizzle `sql` helper from `drizzle-orm`\n * @returns SQLDatabase-compatible adapter\n */\nexport function createDrizzleSQLProvider(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike): SQLDatabase {\n\treturn {\n\t\tprepare(sql: string): PreparedStatement {\n\t\t\treturn new DrizzlePreparedStatement(client, sqlTag, sql);\n\t\t}\n\t};\n}\n\n/**\n * Creates a NuxtHub KV adapter implementing CollegeDB's KV contract.\n *\n * Supports both `@nuxthub/kv` (`get/set/del/keys`) and unstorage-like\n * implementations (`getItem/setItem/removeItem/getKeys`).\n *\n * @param client - NuxtHub KV/Unstorage-like client\n * @returns KVStorage-compatible adapter\n */\nexport function createNuxtHubKVProvider(client: NuxtHubKVLike): KVStorage {\n\treturn {\n\t\tasync get<T = unknown>(key: string, type: 'text' | 'json' = 'text'): Promise<T | string | null> {\n\t\t\tconst raw = await getNuxtHubKVValue(client, key);\n\t\t\tif (raw === null || raw === undefined) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (type === 'json') {\n\t\t\t\tif (typeof raw === 'string') {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(raw) as T;\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tthrow new CollegeDBError(\n\t\t\t\t\t\t\t`Failed to parse JSON from NuxtHub KV for key ${key}: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t\t\t'KV_JSON_PARSE_FAILED'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn raw as T;\n\t\t\t}\n\n\t\t\treturn typeof raw === 'string' ? raw : JSON.stringify(raw);\n\t\t},\n\n\t\tasync put(key: string, value: string): Promise<void> {\n\t\t\tawait setNuxtHubKVValue(client, key, value);\n\t\t},\n\n\t\tasync delete(key: string): Promise<void> {\n\t\t\tawait deleteNuxtHubKVValue(client, key);\n\t\t},\n\n\t\tasync list(options?: { prefix?: string; cursor?: string; limit?: number }): Promise<KVListResult> {\n\t\t\tconst prefix = options?.prefix ?? '';\n\t\t\tconst allKeys = await listNuxtHubKVKeys(client, prefix);\n\t\t\tconst limitedKeys = typeof options?.limit === 'number' ? allKeys.slice(0, options.limit) : allKeys;\n\n\t\t\treturn {\n\t\t\t\tkeys: limitedKeys.map((name) => ({ name })),\n\t\t\t\tlist_complete: true\n\t\t\t};\n\t\t}\n\t};\n}\n\n/**\n * Creates a PostgreSQL adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling at the edge, so this pattern remains fast\n * and scalable in Workers.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => new Client({ connectionString })`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdrivePostgresProvider(\n\thyperdrive: HyperdriveBindingLike,\n\tclientFactory: HyperdrivePostgresClientFactory\n): SQLDatabase {\n\tconst delegatedClient: PostgresClientLike = {\n\t\tquery: async <T = Record<string, unknown>>(sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\tif (typeof client.connect === 'function') {\n\t\t\t\tawait client.connect();\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\treturn await client.query<T>(sql, bindings);\n\t\t\t} finally {\n\t\t\t\tif (typeof client.release === 'function') {\n\t\t\t\t\tclient.release();\n\t\t\t\t} else if (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createPostgreSQLProvider(delegatedClient);\n}\n\n/**\n * Creates a MySQL/MariaDB adapter wired to a Hyperdrive binding.\n *\n * The returned provider creates a transient client for each statement execution.\n * Hyperdrive handles connection pooling under the hood.\n *\n * @param hyperdrive - Hyperdrive binding\n * @param clientFactory - Client factory (e.g. `connectionString => mysql.createConnection(connectionString)`)\n * @returns SQLDatabase-compatible adapter\n */\nexport function createHyperdriveMySQLProvider(hyperdrive: HyperdriveBindingLike, clientFactory: HyperdriveMySQLClientFactory): SQLDatabase {\n\tconst delegatedClient: MySQLClientLike = {\n\t\texecute: async (sql: string, bindings: any[] = []) => {\n\t\t\tconst client = clientFactory(hyperdrive.connectionString);\n\t\t\ttry {\n\t\t\t\tif (typeof client.execute === 'function') {\n\t\t\t\t\treturn await client.execute(sql, bindings);\n\t\t\t\t}\n\t\t\t\tif (typeof client.query === 'function') {\n\t\t\t\t\treturn await client.query(sql, bindings);\n\t\t\t\t}\n\n\t\t\t\tthrow new CollegeDBError('Hyperdrive MySQL client is missing execute/query methods', 'MYSQL_CLIENT_INVALID');\n\t\t\t} finally {\n\t\t\t\tif (typeof client.end === 'function') {\n\t\t\t\t\tawait client.end();\n\t\t\t\t} else if (typeof client.close === 'function') {\n\t\t\t\t\tawait client.close();\n\t\t\t\t} else if (typeof client.destroy === 'function') {\n\t\t\t\t\tclient.destroy();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\treturn createMySQLProvider(delegatedClient);\n}\n\n/**\n * Returns `true` when a value looks like an SQL database provider.\n */\nexport function isSQLDatabase(value: unknown): value is SQLDatabase {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\treturn typeof (value as SQLDatabase).prepare === 'function';\n}\n\n/**\n * Returns `true` when a value looks like a KV storage provider.\n */\nexport function isKVStorage(value: unknown): value is KVStorage {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tconst kv = value as KVStorage;\n\treturn typeof kv.get === 'function' && typeof kv.put === 'function' && typeof kv.delete === 'function' && typeof kv.list === 'function';\n}\n\nclass PostgresPreparedStatement implements PreparedStatement {\n\tprivate readonly client: PostgresClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: PostgresClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new PostgresPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: result.rows ?? [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: typeof result.rowCount === 'number' ? result.rowCount : undefined,\n\t\t\t\tcommand: result.command\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst sql = rewriteQuestionPlaceholders(this.sql);\n\t\tconst result = await this.client.query<T>(sql, this.bindings);\n\t\treturn result.rows?.[0] ?? null;\n\t}\n}\n\nclass MySQLPreparedStatement implements PreparedStatement {\n\tprivate readonly client: MySQLClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: MySQLClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new MySQLPreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\n\t\tif (Array.isArray(rows)) {\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows as T[],\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst packet = rows as MySQLOkPacket;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: packet.affectedRows,\n\t\t\t\tlast_row_id: packet.insertId,\n\t\t\t\twarningStatus: packet.warningStatus\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: Array.isArray(rows) ? (rows as T[]) : [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: !Array.isArray(rows) ? (rows as MySQLOkPacket).affectedRows : undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst rows = await executeMySQL(this.client, this.sql, this.bindings);\n\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn rows[0] as T;\n\t}\n}\n\nclass SQLitePreparedStatement implements PreparedStatement {\n\tprivate readonly client: SQLiteClientLike;\n\tprivate readonly sql: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: SQLiteClientLike, sql: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sql = sql;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new SQLitePreparedStatement(this.client, this.sql, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: rows,\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.run !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().run()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst runResult = await statement.run(...this.bindings);\n\t\tconst runMeta = (runResult ?? {}) as Record<string, unknown>;\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: [],\n\t\t\tmeta: createMeta(startedAt, {\n\t\t\t\tchanges: toMaybeNumber(runMeta.changes),\n\t\t\t\tlast_row_id: (runMeta.lastInsertRowid ?? runMeta.lastID) as number | string | undefined\n\t\t\t})\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tresults: extractRowsFromSQLiteExecute<T>(result),\n\t\t\t\tmeta: createMeta(startedAt)\n\t\t\t};\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement || typeof statement.all !== 'function') {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().all()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tconst rows = await statement.all(...this.bindings);\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: (Array.isArray(rows) ? rows : []) as T[],\n\t\t\tmeta: createMeta(startedAt)\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tif (typeof this.client.execute === 'function') {\n\t\t\tconst result = await this.client.execute(this.sql, this.bindings);\n\t\t\tconst rows = extractRowsFromSQLiteExecute<T>(result);\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tconst statement = this.client.prepare?.(this.sql);\n\t\tif (!statement) {\n\t\t\tthrow new CollegeDBError('SQLite client must expose execute() or prepare().get()', 'SQLITE_CLIENT_INVALID');\n\t\t}\n\n\t\tif (typeof statement.get === 'function') {\n\t\t\tconst row = await statement.get(...this.bindings);\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (typeof statement.all === 'function') {\n\t\t\tconst rows = await statement.all(...this.bindings);\n\t\t\tif (!Array.isArray(rows) || rows.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst firstRow = rows[0];\n\t\t\treturn firstRow === undefined || firstRow === null ? null : (firstRow as T);\n\t\t}\n\n\t\tthrow new CollegeDBError('SQLite prepare() result must expose get() or all()', 'SQLITE_CLIENT_INVALID');\n\t}\n}\n\nclass DrizzlePreparedStatement implements PreparedStatement {\n\tprivate readonly client: DrizzleClientLike;\n\tprivate readonly sqlTag: DrizzleSqlTagLike;\n\tprivate readonly sqlText: string;\n\tprivate readonly bindings: any[];\n\n\tconstructor(client: DrizzleClientLike, sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[] = []) {\n\t\tthis.client = client;\n\t\tthis.sqlTag = sqlTag;\n\t\tthis.sqlText = sqlText;\n\t\tthis.bindings = bindings;\n\t}\n\n\tbind(...bindings: any[]): PreparedStatement {\n\t\treturn new DrizzlePreparedStatement(this.client, this.sqlTag, this.sqlText, bindings);\n\t}\n\n\tasync run<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleRun(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync all<T = Record<string, unknown>>(): Promise<QueryResult<T>> {\n\t\tconst startedAt = Date.now();\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleAll(this.client, query);\n\n\t\treturn {\n\t\t\tsuccess: true,\n\t\t\tresults: extractRowsFromDrizzleExecute<T>(result),\n\t\t\tmeta: createMeta(startedAt, extractMetaFromDrizzleExecute(result))\n\t\t};\n\t}\n\n\tasync first<T = Record<string, unknown>>(): Promise<T | null> {\n\t\tconst query = buildDrizzleQuery(this.sqlTag, this.sqlText, this.bindings);\n\t\tconst result = await executeDrizzleFirst(this.client, query);\n\t\tconst rows = extractRowsFromDrizzleExecute<T>(result);\n\t\tif (rows.length > 0) {\n\t\t\treturn rows[0] ?? null;\n\t\t}\n\n\t\tif (result && typeof result === 'object' && 'row' in result) {\n\t\t\tconst row = (result as Record<string, unknown>).row;\n\t\t\treturn row === undefined || row === null ? null : (row as T);\n\t\t}\n\n\t\tif (\n\t\t\tresult &&\n\t\t\ttypeof result === 'object' &&\n\t\t\t!Array.isArray(result) &&\n\t\t\t!('rows' in result) &&\n\t\t\t!('results' in result) &&\n\t\t\t!('data' in result)\n\t\t) {\n\t\t\treturn result as T;\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nasync function executeRedisScan(\n\tclient: RedisLikeClient,\n\tcursor: string,\n\tpattern: string,\n\tscanCount: number\n): Promise<{ cursor: string; keys: string[] }> {\n\ttry {\n\t\tconst objectResult = await client.scan(cursor, { MATCH: pattern, COUNT: scanCount });\n\t\treturn normalizeRedisScanResult(objectResult);\n\t} catch {\n\t\tconst tupleResult = await client.scan(cursor, 'MATCH', pattern, 'COUNT', String(scanCount));\n\t\treturn normalizeRedisScanResult(tupleResult);\n\t}\n}\n\nfunction normalizeRedisScanResult(result: RedisScanResult): { cursor: string; keys: string[] } {\n\tif (Array.isArray(result)) {\n\t\treturn {\n\t\t\tcursor: String(result[0] ?? '0'),\n\t\t\tkeys: Array.isArray(result[1]) ? result[1] : []\n\t\t};\n\t}\n\n\treturn {\n\t\tcursor: String(result.cursor ?? '0'),\n\t\tkeys: Array.isArray(result.keys) ? result.keys : []\n\t};\n}\n\nasync function executeMySQL(client: MySQLClientLike, sql: string, bindings: any[]): Promise<unknown> {\n\tif (typeof client.execute === 'function') {\n\t\tconst result = await client.execute(sql, bindings);\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result[0];\n\t\t}\n\t\treturn result;\n\t}\n\n\tif (typeof client.query === 'function') {\n\t\tconst result = await client.query(sql, bindings);\n\t\tif (Array.isArray(result)) {\n\t\t\treturn result[0];\n\t\t}\n\t\treturn result;\n\t}\n\n\tthrow new CollegeDBError('MySQL client must expose execute() or query()', 'MYSQL_CLIENT_INVALID');\n}\n\nasync function executeDrizzleRun(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose run(), execute(), or all()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleAll(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.all === 'function') {\n\t\treturn await client.all(query);\n\t}\n\n\tif (typeof client.execute === 'function') {\n\t\treturn await client.execute(query);\n\t}\n\n\tif (typeof client.run === 'function') {\n\t\treturn await client.run(query);\n\t}\n\n\tthrow new CollegeDBError('Drizzle client must expose all(), execute(), or run()', 'DRIZZLE_CLIENT_INVALID');\n}\n\nasync function executeDrizzleFirst(client: DrizzleClientLike, query: DrizzleSqlChunkLike): Promise<unknown> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get(query);\n\t}\n\n\treturn await executeDrizzleAll(client, query);\n}\n\nfunction buildDrizzleQuery(sqlTag: DrizzleSqlTagLike, sqlText: string, bindings: any[]): DrizzleSqlChunkLike {\n\tconst segments = splitQuestionPlaceholders(sqlText);\n\tconst placeholderCount = segments.length - 1;\n\n\tif (placeholderCount !== bindings.length) {\n\t\tthrow new CollegeDBError(\n\t\t\t`Drizzle binding mismatch: expected ${placeholderCount} bindings, received ${bindings.length}`,\n\t\t\t'DRIZZLE_BINDINGS_MISMATCH'\n\t\t);\n\t}\n\n\tif (placeholderCount === 0) {\n\t\treturn sqlTag.raw(sqlText);\n\t}\n\n\tconst statement = typeof sqlTag.empty === 'function' ? sqlTag.empty() : sqlTag.raw('');\n\n\tfor (let i = 0; i < segments.length; i++) {\n\t\tconst segment = segments[i];\n\t\tif (segment) {\n\t\t\tstatement.append(sqlTag.raw(segment));\n\t\t}\n\n\t\tif (i < placeholderCount) {\n\t\t\tstatement.append(sqlTag`${bindings[i]}`);\n\t\t}\n\t}\n\n\treturn statement;\n}\n\nfunction splitQuestionPlaceholders(sql: string): string[] {\n\tconst segments: string[] = [];\n\tlet segmentStart = 0;\n\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tif (inSingleQuote && next === \"'\") {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tif (inDoubleQuote && next === '\"') {\n\t\t\t\ti++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tsegments.push(sql.slice(segmentStart, i));\n\t\t\tsegmentStart = i + 1;\n\t\t}\n\t}\n\n\tsegments.push(sql.slice(segmentStart));\n\treturn segments;\n}\n\nfunction extractRowsFromDrizzleExecute<T>(result: unknown): T[] {\n\tif (Array.isArray(result)) {\n\t\tif (result.length === 2 && Array.isArray(result[0])) {\n\t\t\treturn result[0] as T[];\n\t\t}\n\n\t\tif (\n\t\t\tresult.length === 2 &&\n\t\t\tresult[0] &&\n\t\t\ttypeof result[0] === 'object' &&\n\t\t\t!Array.isArray(result[0]) &&\n\t\t\t(Array.isArray(result[1]) || result[1] === null || result[1] === undefined)\n\t\t) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectResult = result as Record<string, unknown>;\n\n\t\tif (Array.isArray(objectResult.rows)) {\n\t\t\treturn objectResult.rows as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectResult.results)) {\n\t\t\treturn objectResult.results as T[];\n\t\t}\n\n\t\tif (Array.isArray(objectResult.data)) {\n\t\t\treturn objectResult.data as T[];\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction extractMetaFromDrizzleExecute(result: unknown): Record<string, unknown> {\n\tif (!result) {\n\t\treturn {};\n\t}\n\n\tlet objectResult: Record<string, unknown> | undefined;\n\n\tif (Array.isArray(result) && result.length === 2 && result[0] && typeof result[0] === 'object' && !Array.isArray(result[0])) {\n\t\tobjectResult = result[0] as Record<string, unknown>;\n\t} else if (typeof result === 'object' && !Array.isArray(result)) {\n\t\tobjectResult = result as Record<string, unknown>;\n\t}\n\n\tif (!objectResult) {\n\t\treturn {};\n\t}\n\n\tconst meta: Record<string, unknown> = {};\n\n\tconst changes = toMaybeNumber(objectResult.rowCount) ?? toMaybeNumber(objectResult.changes) ?? toMaybeNumber(objectResult.affectedRows);\n\tif (changes !== undefined) {\n\t\tmeta.changes = changes;\n\t}\n\n\tconst lastRowId = objectResult.lastInsertRowid ?? objectResult.lastInsertId ?? objectResult.insertId;\n\tif (typeof lastRowId === 'number' || typeof lastRowId === 'string') {\n\t\tmeta.last_row_id = lastRowId;\n\t}\n\n\tif (objectResult.meta && typeof objectResult.meta === 'object') {\n\t\tObject.assign(meta, objectResult.meta as Record<string, unknown>);\n\t}\n\n\treturn meta;\n}\n\nasync function getNuxtHubKVValue<T = unknown>(client: NuxtHubKVLike, key: string): Promise<T | null | undefined> {\n\tif (typeof client.get === 'function') {\n\t\treturn await client.get<T>(key);\n\t}\n\n\tif (typeof client.getItem === 'function') {\n\t\treturn await client.getItem<T>(key);\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose get() or getItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function setNuxtHubKVValue(client: NuxtHubKVLike, key: string, value: string): Promise<void> {\n\tif (typeof client.set === 'function') {\n\t\tawait client.set(key, value);\n\t\treturn;\n\t}\n\n\tif (typeof client.setItem === 'function') {\n\t\tawait client.setItem(key, value);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose set() or setItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function deleteNuxtHubKVValue(client: NuxtHubKVLike, key: string): Promise<void> {\n\tif (typeof client.del === 'function') {\n\t\tawait client.del(key);\n\t\treturn;\n\t}\n\n\tif (typeof client.removeItem === 'function') {\n\t\tawait client.removeItem(key);\n\t\treturn;\n\t}\n\n\tthrow new CollegeDBError('NuxtHub KV client must expose del() or removeItem()', 'NUXTHUB_KV_CLIENT_INVALID');\n}\n\nasync function listNuxtHubKVKeys(client: NuxtHubKVLike, prefix: string): Promise<string[]> {\n\tlet keys: readonly string[];\n\n\tif (typeof client.keys === 'function') {\n\t\tkeys = await client.keys(prefix);\n\t} else if (typeof client.getKeys === 'function') {\n\t\tkeys = await client.getKeys(prefix);\n\t} else {\n\t\tthrow new CollegeDBError('NuxtHub KV client must expose keys() or getKeys()', 'NUXTHUB_KV_CLIENT_INVALID');\n\t}\n\n\tif (!Array.isArray(keys)) {\n\t\treturn [];\n\t}\n\n\tif (!prefix) {\n\t\treturn [...keys];\n\t}\n\n\treturn keys.filter((key) => key.startsWith(prefix));\n}\n\nfunction extractRowsFromSQLiteExecute<T>(result: unknown): T[] {\n\tif (Array.isArray(result)) {\n\t\treturn result as T[];\n\t}\n\n\tif (result && typeof result === 'object') {\n\t\tconst objectResult = result as Record<string, unknown>;\n\n\t\tif (Array.isArray(objectResult.rows)) {\n\t\t\treturn objectResult.rows as T[];\n\t\t}\n\t\tif (Array.isArray(objectResult.results)) {\n\t\t\treturn objectResult.results as T[];\n\t\t}\n\t}\n\n\treturn [];\n}\n\nfunction createMeta(startedAt: number, extra: Record<string, unknown> = {}): QueryResultMeta {\n\treturn {\n\t\tduration: Date.now() - startedAt,\n\t\t...extra\n\t};\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) {\n\t\treturn value;\n\t}\n\treturn undefined;\n}\n\nconst postgresPlaceholderCache = new Map<string, string>();\n\nfunction rewriteQuestionPlaceholders(sql: string): string {\n\tconst cached = postgresPlaceholderCache.get(sql);\n\tif (cached) {\n\t\treturn cached;\n\t}\n\n\tlet output = '';\n\tlet placeholderIndex = 0;\n\tlet inSingleQuote = false;\n\tlet inDoubleQuote = false;\n\tlet inLineComment = false;\n\tlet inBlockComment = false;\n\n\tfor (let i = 0; i < sql.length; i++) {\n\t\tconst char = sql[i]!;\n\t\tconst next = i + 1 < sql.length ? sql[i + 1] : '';\n\n\t\tif (inLineComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '\\n') {\n\t\t\t\tinLineComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (inBlockComment) {\n\t\t\toutput += char;\n\t\t\tif (char === '*' && next === '/') {\n\t\t\t\toutput += '/';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = false;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inSingleQuote && !inDoubleQuote) {\n\t\t\tif (char === '-' && next === '-') {\n\t\t\t\toutput += '--';\n\t\t\t\ti++;\n\t\t\t\tinLineComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === '/' && next === '*') {\n\t\t\t\toutput += '/*';\n\t\t\t\ti++;\n\t\t\t\tinBlockComment = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\tif (char === \"'\" && !inDoubleQuote) {\n\t\t\tinSingleQuote = !inSingleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"' && !inSingleQuote) {\n\t\t\tinDoubleQuote = !inDoubleQuote;\n\t\t\toutput += char;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '?' && !inSingleQuote && !inDoubleQuote) {\n\t\t\tplaceholderIndex++;\n\t\t\toutput += `$${placeholderIndex}`;\n\t\t\tcontinue;\n\t\t}\n\n\t\toutput += char;\n\t}\n\n\tpostgresPlaceholderCache.set(sql, output);\n\tif (postgresPlaceholderCache.size > 5000) {\n\t\tconst firstKey = postgresPlaceholderCache.keys().next().value;\n\t\tif (firstKey) {\n\t\t\tpostgresPlaceholderCache.delete(firstKey);\n\t\t}\n\t}\n\n\treturn output;\n}\n"
12
12
  ],
13
- "mappings": "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",
14
- "debugId": "B2F0A9ADB6FD57E164756E2164756E21",
13
+ "mappings": "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",
14
+ "debugId": "5E9B10391C3C7EF564756E2164756E21",
15
15
  "names": []
16
16
  }
@@ -27,9 +27,9 @@ import type { KVStorage, SQLDatabase } from './types';
27
27
  */
28
28
  export interface RedisLikeClient {
29
29
  get(key: string): Promise<string | null>;
30
- set(key: string, value: string): Promise<unknown>;
31
- del(key: string): Promise<unknown>;
32
- scan(cursor: string, ...args: any[]): Promise<RedisScanResult>;
30
+ set(key: string, value: string): unknown | Promise<unknown>;
31
+ del(key: string): unknown | Promise<unknown>;
32
+ scan(cursor: string, ...args: any[]): RedisScanResult | Promise<RedisScanResult>;
33
33
  }
34
34
  /**
35
35
  * Redis/Valkey SCAN response in ioredis tuple form.
@@ -65,8 +65,8 @@ export interface PostgresClientLike {
65
65
  * Optional lifecycle methods used by Hyperdrive helpers.
66
66
  */
67
67
  export interface PostgresLifecycleClientLike extends PostgresClientLike {
68
- connect?: () => Promise<void>;
69
- end?: () => Promise<void>;
68
+ connect?: () => void | Promise<void>;
69
+ end?: () => void | Promise<void>;
70
70
  release?: () => void;
71
71
  }
72
72
  /**
@@ -82,15 +82,15 @@ export interface MySQLOkPacket {
82
82
  * Minimal MySQL/MariaDB client contract used by adapters.
83
83
  */
84
84
  export interface MySQLClientLike {
85
- execute?: (sql: string, bindings?: any[]) => Promise<[unknown, unknown]>;
86
- query?: (sql: string, bindings?: any[]) => Promise<[unknown, unknown]>;
85
+ execute?: (sql: string, bindings?: any[]) => any | Promise<any>;
86
+ query?: (sql: string, bindings?: any[]) => any | Promise<any>;
87
87
  }
88
88
  /**
89
89
  * Optional lifecycle methods used by Hyperdrive helpers.
90
90
  */
91
91
  export interface MySQLLifecycleClientLike extends MySQLClientLike {
92
- end?: () => Promise<void>;
93
- close?: () => Promise<void>;
92
+ end?: () => void | Promise<void>;
93
+ close?: () => void | Promise<void>;
94
94
  destroy?: () => void;
95
95
  }
96
96
  /**
@@ -106,7 +106,7 @@ export interface SQLiteStatementLike {
106
106
  */
107
107
  export interface SQLiteClientLike {
108
108
  prepare?: (sql: string) => SQLiteStatementLike;
109
- execute?: (sql: string, bindings?: any[]) => Promise<unknown>;
109
+ execute?: (sql: string, bindings?: any[]) => any | Promise<any>;
110
110
  }
111
111
  /**
112
112
  * Hyperdrive binding shape used by helper factories.
@@ -141,25 +141,25 @@ export interface DrizzleSqlTagLike {
141
141
  * Minimal Drizzle database contract used by the SQL adapter.
142
142
  */
143
143
  export interface DrizzleClientLike {
144
- execute?: (query: unknown) => Promise<unknown>;
145
- run?: (query: unknown) => Promise<unknown>;
146
- all?: (query: unknown) => Promise<unknown>;
147
- get?: (query: unknown) => Promise<unknown>;
144
+ execute?: (query: any) => any | Promise<any>;
145
+ run?: (query: any) => any | Promise<any>;
146
+ all?: (query: any) => any | Promise<any>;
147
+ get?: (query: any) => any | Promise<any>;
148
148
  }
149
149
  /**
150
150
  * NuxtHub/Unstorage-like KV contract used by the adapter.
151
151
  */
152
152
  export interface NuxtHubKVLike {
153
- get?<T = unknown>(key: string): Promise<T | null | undefined>;
154
- set?(key: string, value: unknown, options?: {
153
+ get?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;
154
+ set?(key: string, value: any, options?: {
155
155
  ttl?: number;
156
- }): Promise<unknown>;
157
- del?(key: string): Promise<unknown>;
158
- keys?(prefix?: string): Promise<string[]>;
159
- getItem?<T = unknown>(key: string): Promise<T | null | undefined>;
160
- setItem?(key: string, value: unknown): Promise<unknown>;
161
- removeItem?(key: string): Promise<unknown>;
162
- getKeys?(prefix?: string): Promise<string[]>;
156
+ }): any | Promise<any>;
157
+ del?(key: string): any | Promise<any>;
158
+ keys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;
159
+ getItem?<T = any>(key: string): T | null | undefined | Promise<T | null | undefined>;
160
+ setItem?(key: string, value: any): any | Promise<any>;
161
+ removeItem?(key: string): any | Promise<any>;
162
+ getKeys?(prefix?: string): string[] | readonly string[] | Promise<string[] | readonly string[]>;
163
163
  }
164
164
  /**
165
165
  * Creates a Redis-backed KV provider adapter.
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
7
- "version": "1.1.1",
7
+ "version": "1.1.2",
8
8
  "files": [
9
9
  "dist/**/*",
10
10
  "README.md",
@@ -48,22 +48,22 @@
48
48
  "@babel/core": "^7.29.0",
49
49
  "@babel/preset-env": "^7.29.2",
50
50
  "@babel/preset-typescript": "^7.28.5",
51
- "@cloudflare/workers-types": "^4.20260415.1",
51
+ "@cloudflare/workers-types": "^4.20260418.1",
52
52
  "@types/bun": "latest",
53
- "@types/pg": "^8.15.6",
53
+ "@types/pg": "^8.20.0",
54
54
  "@vitest/coverage-v8": "^4.1.4",
55
55
  "drizzle-orm": "^0.45.2",
56
56
  "husky": "^9.1.7",
57
57
  "jsdoc-babel": "^0.5.0",
58
58
  "lint-staged": "^16.4.0",
59
- "mysql2": "^3.15.3",
60
- "pg": "^8.16.3",
59
+ "mysql2": "^3.22.1",
60
+ "pg": "^8.20.0",
61
61
  "prettier": "^3.8.3",
62
62
  "prettier-plugin-organize-imports": "4.3.0",
63
- "redis": "^5.8.2",
63
+ "redis": "^5.12.1",
64
64
  "typedoc": "^0.28.19",
65
65
  "vitest": "^4.1.4",
66
- "wrangler": "^4.64.0"
66
+ "wrangler": "^4.83.0"
67
67
  },
68
68
  "peerDependencies": {
69
69
  "typescript": "^5.8.3"