@hatk/hatk 0.0.1-alpha.35 → 0.0.1-alpha.37
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/backfill.js +6 -6
- package/dist/cli.js +56 -13
- package/dist/cloudflare/container.d.ts +73 -0
- package/dist/cloudflare/container.d.ts.map +1 -0
- package/dist/cloudflare/container.js +232 -0
- package/dist/cloudflare/hooks.d.ts +33 -0
- package/dist/cloudflare/hooks.d.ts.map +1 -0
- package/dist/cloudflare/hooks.js +40 -0
- package/dist/cloudflare/init.d.ts +27 -0
- package/dist/cloudflare/init.d.ts.map +1 -0
- package/dist/cloudflare/init.js +103 -0
- package/dist/cloudflare/worker.d.ts +27 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +54 -0
- package/dist/database/adapters/d1.d.ts +56 -0
- package/dist/database/adapters/d1.d.ts.map +1 -0
- package/dist/database/adapters/d1.js +108 -0
- package/dist/database/db.d.ts +8 -0
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +54 -5
- package/dist/database/fts.js +1 -1
- package/dist/database/schema.d.ts +1 -0
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +27 -21
- package/dist/labels.d.ts +1 -1
- package/dist/labels.d.ts.map +1 -1
- package/dist/labels.js +2 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +24 -31
- package/package.json +1 -1
- package/public/admin.html +0 -54
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Cloudflare initialization logic used by both the standalone Worker
|
|
3
|
+
* entry and the SvelteKit handle hook.
|
|
4
|
+
*/
|
|
5
|
+
import { D1Adapter } from "../database/adapters/d1.js";
|
|
6
|
+
import { initDatabase, migrateSchema } from "../database/db.js";
|
|
7
|
+
import { storeLexicons, discoverCollections, buildSchemas } from "../database/schema.js";
|
|
8
|
+
import { discoverViews } from "../views.js";
|
|
9
|
+
import { getDialect } from "../database/dialect.js";
|
|
10
|
+
import { setSearchPort } from "../database/fts.js";
|
|
11
|
+
import { initOAuth } from "../oauth/server.js";
|
|
12
|
+
import { parseSessionCookie, getSessionCookieName } from "../oauth/session.js";
|
|
13
|
+
import { createHandler, registerCoreHandlers } from "../server.js";
|
|
14
|
+
import { configureRelay } from "../xrpc.js";
|
|
15
|
+
import { callXrpc } from "../xrpc.js";
|
|
16
|
+
import { validateLexicons } from '@bigmoves/lexicon';
|
|
17
|
+
let handler = null;
|
|
18
|
+
let initPromise = null;
|
|
19
|
+
/**
|
|
20
|
+
* One-time initialization. Sets up D1 adapter, database schemas, XRPC
|
|
21
|
+
* handlers, OAuth, and the globalThis bridge for SvelteKit SSR.
|
|
22
|
+
*/
|
|
23
|
+
async function initialize(env) {
|
|
24
|
+
const relay = env.HATK_RELAY || 'wss://bsky.network';
|
|
25
|
+
const plc = env.HATK_PLC || 'https://plc.directory';
|
|
26
|
+
configureRelay(relay);
|
|
27
|
+
const admins = env.HATK_ADMINS ? env.HATK_ADMINS.split(',').map((s) => s.trim()) : [];
|
|
28
|
+
// Load lexicons — injected at build time via virtual module
|
|
29
|
+
let lexicons;
|
|
30
|
+
try {
|
|
31
|
+
// @ts-expect-error — virtual module generated at build time
|
|
32
|
+
const lexiconModule = await import('virtual:hatk-lexicons');
|
|
33
|
+
lexicons = new Map(Object.entries(lexiconModule.default));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
lexicons = new Map();
|
|
37
|
+
}
|
|
38
|
+
const lexiconErrors = validateLexicons([...lexicons.values()]);
|
|
39
|
+
if (lexiconErrors) {
|
|
40
|
+
for (const [nsid, errors] of Object.entries(lexiconErrors)) {
|
|
41
|
+
for (const err of errors) {
|
|
42
|
+
console.error(`[hatk] Invalid lexicon ${nsid}: ${err}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
throw new Error('Invalid lexicons — check build output');
|
|
46
|
+
}
|
|
47
|
+
storeLexicons(lexicons);
|
|
48
|
+
const collections = env.HATK_COLLECTIONS
|
|
49
|
+
? env.HATK_COLLECTIONS.split(',').map((s) => s.trim())
|
|
50
|
+
: discoverCollections(lexicons);
|
|
51
|
+
// Build schemas and init D1
|
|
52
|
+
discoverViews();
|
|
53
|
+
const engineDialect = getDialect('d1');
|
|
54
|
+
const { schemas, ddlStatements } = buildSchemas(lexicons, collections, engineDialect);
|
|
55
|
+
const adapter = new D1Adapter();
|
|
56
|
+
adapter.initWithBinding(env.DB);
|
|
57
|
+
setSearchPort(null);
|
|
58
|
+
await initDatabase(adapter, ':memory:', schemas, ddlStatements);
|
|
59
|
+
await migrateSchema(schemas);
|
|
60
|
+
// Register core XRPC handlers
|
|
61
|
+
const oauthConfig = env.HATK_OAUTH_ISSUER
|
|
62
|
+
? {
|
|
63
|
+
issuer: env.HATK_OAUTH_ISSUER,
|
|
64
|
+
scopes: env.HATK_OAUTH_SCOPES ? env.HATK_OAUTH_SCOPES.split(',').map((s) => s.trim()) : ['read', 'write'],
|
|
65
|
+
clients: [],
|
|
66
|
+
}
|
|
67
|
+
: null;
|
|
68
|
+
registerCoreHandlers(collections, oauthConfig);
|
|
69
|
+
if (oauthConfig) {
|
|
70
|
+
await initOAuth(oauthConfig, plc, relay);
|
|
71
|
+
}
|
|
72
|
+
// Expose bridge for SvelteKit SSR
|
|
73
|
+
;
|
|
74
|
+
globalThis.__hatk_callXrpc = callXrpc;
|
|
75
|
+
globalThis.__hatk_parseSessionCookie = parseSessionCookie;
|
|
76
|
+
globalThis.__hatk_sessionCookieName = getSessionCookieName();
|
|
77
|
+
// Create the request handler
|
|
78
|
+
handler = createHandler({
|
|
79
|
+
collections,
|
|
80
|
+
publicDir: null,
|
|
81
|
+
oauth: oauthConfig,
|
|
82
|
+
admins,
|
|
83
|
+
onResync: undefined,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Ensure initialization has completed. Concurrent calls share the same promise.
|
|
88
|
+
*/
|
|
89
|
+
export function ensureInit(env) {
|
|
90
|
+
if (handler)
|
|
91
|
+
return Promise.resolve();
|
|
92
|
+
if (!initPromise) {
|
|
93
|
+
initPromise = initialize(env).catch((err) => {
|
|
94
|
+
initPromise = null;
|
|
95
|
+
throw err;
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
return initPromise;
|
|
99
|
+
}
|
|
100
|
+
/** Get the hatk request handler (only valid after init). */
|
|
101
|
+
export function getHandler() {
|
|
102
|
+
return handler;
|
|
103
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Worker entry point for hatk.
|
|
3
|
+
*
|
|
4
|
+
* Handles HTTP requests via the Workers fetch handler. The firehose indexer
|
|
5
|
+
* and backfill run in a companion Container — the Worker only serves the
|
|
6
|
+
* API and web UI.
|
|
7
|
+
*
|
|
8
|
+
* For SvelteKit apps, prefer using the handle hook from
|
|
9
|
+
* '@hatk/hatk/cloudflare/hooks' with adapter-cloudflare instead.
|
|
10
|
+
*/
|
|
11
|
+
import { type CloudflareEnv } from './init.ts';
|
|
12
|
+
interface ContainerBinding {
|
|
13
|
+
resync(did: string): Promise<void>;
|
|
14
|
+
fetch(request: Request): Promise<Response>;
|
|
15
|
+
}
|
|
16
|
+
interface Env extends CloudflareEnv {
|
|
17
|
+
CONTAINER: ContainerBinding;
|
|
18
|
+
}
|
|
19
|
+
interface ExecutionContext {
|
|
20
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
21
|
+
passThroughOnException(): void;
|
|
22
|
+
}
|
|
23
|
+
declare const _default: {
|
|
24
|
+
fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response>;
|
|
25
|
+
};
|
|
26
|
+
export default _default;
|
|
27
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/cloudflare/worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,WAAW,CAAA;AAGtE,UAAU,gBAAgB;IACxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;CAC3C;AAED,UAAU,GAAI,SAAQ,aAAa;IACjC,SAAS,EAAE,gBAAgB,CAAA;CAC5B;AAED,UAAU,gBAAgB;IACxB,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI,CAAA;IAC1C,sBAAsB,IAAI,IAAI,CAAA;CAC/B;;mBAGsB,OAAO,OAAO,GAAG,OAAO,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADnF,wBA2CC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Worker entry point for hatk.
|
|
3
|
+
*
|
|
4
|
+
* Handles HTTP requests via the Workers fetch handler. The firehose indexer
|
|
5
|
+
* and backfill run in a companion Container — the Worker only serves the
|
|
6
|
+
* API and web UI.
|
|
7
|
+
*
|
|
8
|
+
* For SvelteKit apps, prefer using the handle hook from
|
|
9
|
+
* '@hatk/hatk/cloudflare/hooks' with adapter-cloudflare instead.
|
|
10
|
+
*/
|
|
11
|
+
import { ensureInit, getHandler } from "./init.js";
|
|
12
|
+
import { isHatkRoute } from "../adapter.js";
|
|
13
|
+
export default {
|
|
14
|
+
async fetch(request, env, ctx) {
|
|
15
|
+
try {
|
|
16
|
+
await ensureInit(env);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return new Response(JSON.stringify({ error: 'Initialization failed', detail: err.message }), {
|
|
20
|
+
status: 500,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
const url = new URL(request.url);
|
|
25
|
+
const handler = getHandler();
|
|
26
|
+
// Intercept admin resync to delegate to the Container via RPC
|
|
27
|
+
if (url.pathname === '/admin/repos/resync' && request.method === 'POST') {
|
|
28
|
+
try {
|
|
29
|
+
const body = await request.text();
|
|
30
|
+
const { dids } = body ? JSON.parse(body) : {};
|
|
31
|
+
if (Array.isArray(dids)) {
|
|
32
|
+
for (const did of dids) {
|
|
33
|
+
ctx.waitUntil(env.CONTAINER.resync(did));
|
|
34
|
+
}
|
|
35
|
+
return new Response(JSON.stringify({ resyncing: dids.length }), {
|
|
36
|
+
headers: { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' },
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
return new Response(JSON.stringify({ error: err.message }), {
|
|
42
|
+
status: 500,
|
|
43
|
+
headers: { 'Content-Type': 'application/json' },
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// hatk routes → handler
|
|
48
|
+
if (isHatkRoute(url.pathname)) {
|
|
49
|
+
return handler(request);
|
|
50
|
+
}
|
|
51
|
+
// Everything else → 404 (use cloudflare/hooks for SvelteKit integration)
|
|
52
|
+
return new Response('Not found', { status: 404 });
|
|
53
|
+
},
|
|
54
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { DatabasePort, BulkInserter, Dialect } from '../ports.ts';
|
|
2
|
+
/**
|
|
3
|
+
* D1 database adapter for Cloudflare Workers/Containers.
|
|
4
|
+
*
|
|
5
|
+
* D1 is SQLite under the hood but accessed via an HTTP-based binding API.
|
|
6
|
+
* Key differences from the SQLite adapter:
|
|
7
|
+
* - No raw transactions — uses d1.batch() for atomic multi-statement execution
|
|
8
|
+
* - No prepared statement reuse — each query is a fresh prepare+bind
|
|
9
|
+
* - Bulk inserts use batched INSERT statements instead of native appenders
|
|
10
|
+
*/
|
|
11
|
+
/** Minimal D1 type definitions (matches Cloudflare's D1Database binding) */
|
|
12
|
+
interface D1Database {
|
|
13
|
+
prepare(sql: string): D1PreparedStatement;
|
|
14
|
+
batch<T = unknown>(statements: D1PreparedStatement[]): Promise<D1Result<T>[]>;
|
|
15
|
+
exec(sql: string): Promise<D1ExecResult>;
|
|
16
|
+
}
|
|
17
|
+
interface D1PreparedStatement {
|
|
18
|
+
bind(...values: unknown[]): D1PreparedStatement;
|
|
19
|
+
all<T = Record<string, unknown>>(): Promise<D1Result<T>>;
|
|
20
|
+
run(): Promise<D1Result>;
|
|
21
|
+
first<T = Record<string, unknown>>(column?: string): Promise<T | null>;
|
|
22
|
+
}
|
|
23
|
+
interface D1Result<T = unknown> {
|
|
24
|
+
results: T[];
|
|
25
|
+
success: boolean;
|
|
26
|
+
meta: Record<string, unknown>;
|
|
27
|
+
}
|
|
28
|
+
interface D1ExecResult {
|
|
29
|
+
count: number;
|
|
30
|
+
duration: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class D1Adapter implements DatabasePort {
|
|
33
|
+
dialect: Dialect;
|
|
34
|
+
private db;
|
|
35
|
+
private txBuffer;
|
|
36
|
+
/**
|
|
37
|
+
* Initialize with an existing D1 binding (from env.DB in Worker/Container).
|
|
38
|
+
* The `path` argument is ignored — D1 bindings are configured in wrangler.jsonc.
|
|
39
|
+
*/
|
|
40
|
+
open(_path: string): Promise<void>;
|
|
41
|
+
/** Set the D1 binding directly (called before open). */
|
|
42
|
+
initWithBinding(db: D1Database): void;
|
|
43
|
+
close(): void;
|
|
44
|
+
query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<T[]>;
|
|
45
|
+
execute(sql: string, params?: unknown[]): Promise<void>;
|
|
46
|
+
executeMultiple(sql: string): Promise<void>;
|
|
47
|
+
beginTransaction(): Promise<void>;
|
|
48
|
+
commit(): Promise<void>;
|
|
49
|
+
rollback(): Promise<void>;
|
|
50
|
+
createBulkInserter(table: string, columns: string[], options?: {
|
|
51
|
+
onConflict?: 'ignore' | 'replace';
|
|
52
|
+
batchSize?: number;
|
|
53
|
+
}): Promise<BulkInserter>;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=d1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"d1.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/d1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAEtE;;;;;;;;GAQG;AAEH,4EAA4E;AAC5E,UAAU,UAAU;IAClB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAA;IACzC,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAC7E,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;CACzC;AAED,UAAU,mBAAmB;IAC3B,IAAI,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAAA;IAC/C,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxD,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;IACxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;CACvE;AAED,UAAU,QAAQ,CAAC,CAAC,GAAG,OAAO;IAC5B,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC9B;AAED,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAmBD,qBAAa,SAAU,YAAW,YAAY;IAC5C,OAAO,EAAE,OAAO,CAAO;IAEvB,OAAO,CAAC,EAAE,CAAa;IACvB,OAAO,CAAC,QAAQ,CAAqC;IAErD;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,wDAAwD;IACxD,eAAe,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI;IAIrC,KAAK,IAAI,IAAI;IAIP,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAOrF,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3D,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IASvB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,kBAAkB,CACtB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,OAAO,CAAC,YAAY,CAAC;CA+BzB"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Translate DuckDB-style $1, $2 placeholders to ? placeholders.
|
|
3
|
+
* Same logic as the SQLite adapter — D1 uses ? style.
|
|
4
|
+
*/
|
|
5
|
+
function translateParams(sql, params) {
|
|
6
|
+
if (params.length === 0)
|
|
7
|
+
return { sql, params };
|
|
8
|
+
const expandedParams = [];
|
|
9
|
+
const translated = sql.replace(/\$(\d+)/g, (_match, numStr) => {
|
|
10
|
+
const idx = parseInt(numStr) - 1;
|
|
11
|
+
expandedParams.push(params[idx]);
|
|
12
|
+
return '?';
|
|
13
|
+
});
|
|
14
|
+
return { sql: translated, params: expandedParams };
|
|
15
|
+
}
|
|
16
|
+
export class D1Adapter {
|
|
17
|
+
dialect = 'd1';
|
|
18
|
+
db;
|
|
19
|
+
txBuffer = null;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize with an existing D1 binding (from env.DB in Worker/Container).
|
|
22
|
+
* The `path` argument is ignored — D1 bindings are configured in wrangler.jsonc.
|
|
23
|
+
*/
|
|
24
|
+
async open(_path) {
|
|
25
|
+
// D1 binding is injected via initWithBinding(), not opened by path.
|
|
26
|
+
// This is a no-op if already initialized.
|
|
27
|
+
if (!this.db) {
|
|
28
|
+
throw new Error('D1Adapter requires initWithBinding(db) before use');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Set the D1 binding directly (called before open). */
|
|
32
|
+
initWithBinding(db) {
|
|
33
|
+
this.db = db;
|
|
34
|
+
}
|
|
35
|
+
close() {
|
|
36
|
+
// D1 bindings don't need explicit cleanup
|
|
37
|
+
}
|
|
38
|
+
async query(sql, params = []) {
|
|
39
|
+
const t = translateParams(sql, params);
|
|
40
|
+
const stmt = t.params.length > 0 ? this.db.prepare(t.sql).bind(...t.params) : this.db.prepare(t.sql);
|
|
41
|
+
const result = await stmt.all();
|
|
42
|
+
return result.results;
|
|
43
|
+
}
|
|
44
|
+
async execute(sql, params = []) {
|
|
45
|
+
const t = translateParams(sql, params);
|
|
46
|
+
const stmt = t.params.length > 0 ? this.db.prepare(t.sql).bind(...t.params) : this.db.prepare(t.sql);
|
|
47
|
+
// If inside a transaction, buffer instead of executing
|
|
48
|
+
if (this.txBuffer !== null) {
|
|
49
|
+
this.txBuffer.push(stmt);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await stmt.run();
|
|
53
|
+
}
|
|
54
|
+
async executeMultiple(sql) {
|
|
55
|
+
// D1's exec() can be unreliable with multi-statement SQL.
|
|
56
|
+
// Split on semicolons and run each statement via prepare().run().
|
|
57
|
+
const statements = sql
|
|
58
|
+
.split(';')
|
|
59
|
+
.map((s) => s.trim())
|
|
60
|
+
.filter((s) => s.length > 0);
|
|
61
|
+
for (const stmt of statements) {
|
|
62
|
+
await this.db.prepare(stmt).run();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async beginTransaction() {
|
|
66
|
+
this.txBuffer = [];
|
|
67
|
+
}
|
|
68
|
+
async commit() {
|
|
69
|
+
if (this.txBuffer === null)
|
|
70
|
+
return;
|
|
71
|
+
const statements = this.txBuffer;
|
|
72
|
+
this.txBuffer = null;
|
|
73
|
+
if (statements.length > 0) {
|
|
74
|
+
await this.db.batch(statements);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async rollback() {
|
|
78
|
+
this.txBuffer = null;
|
|
79
|
+
}
|
|
80
|
+
async createBulkInserter(table, columns, options) {
|
|
81
|
+
const placeholders = columns.map(() => '?').join(', ');
|
|
82
|
+
const conflict = options?.onConflict === 'ignore' ? ' OR IGNORE' : options?.onConflict === 'replace' ? ' OR REPLACE' : '';
|
|
83
|
+
const sqlTemplate = `INSERT${conflict} INTO ${table} (${columns.join(', ')}) VALUES (${placeholders})`;
|
|
84
|
+
const buffer = [];
|
|
85
|
+
const batchSize = options?.batchSize ?? 200; // smaller batches for D1 CPU limits
|
|
86
|
+
const db = this.db;
|
|
87
|
+
const flush = async () => {
|
|
88
|
+
if (buffer.length > 0) {
|
|
89
|
+
await db.batch(buffer);
|
|
90
|
+
buffer.length = 0;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
append(values) {
|
|
95
|
+
buffer.push(db.prepare(sqlTemplate).bind(...values));
|
|
96
|
+
if (buffer.length >= batchSize) {
|
|
97
|
+
flush();
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
async flush() {
|
|
101
|
+
await flush();
|
|
102
|
+
},
|
|
103
|
+
async close() {
|
|
104
|
+
await flush();
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
package/dist/database/db.d.ts
CHANGED
|
@@ -32,6 +32,9 @@ export declare function getRepoRetryInfo(did: string): Promise<{
|
|
|
32
32
|
} | null>;
|
|
33
33
|
export declare function listRetryEligibleRepos(maxRetries: number): Promise<string[]>;
|
|
34
34
|
export declare function listPendingRepos(): Promise<string[]>;
|
|
35
|
+
export declare function listActiveRepoDids(): Promise<string[]>;
|
|
36
|
+
export declare function removeRepo(did: string): Promise<void>;
|
|
37
|
+
export declare function getRepoHandle(did: string): Promise<string | null>;
|
|
35
38
|
export declare function listAllRepoStatuses(): Promise<Array<{
|
|
36
39
|
did: string;
|
|
37
40
|
status: string;
|
|
@@ -46,6 +49,11 @@ export declare function listReposPaginated(opts?: {
|
|
|
46
49
|
total: number;
|
|
47
50
|
}>;
|
|
48
51
|
export declare function getCollectionCounts(): Promise<Record<string, number>>;
|
|
52
|
+
export declare function getRepoStatusCounts(): Promise<Record<string, number>>;
|
|
53
|
+
export declare function getDatabaseSize(): Promise<Record<string, string>>;
|
|
54
|
+
export declare function getLabelCount(val: string): Promise<number>;
|
|
55
|
+
export declare function deleteLabels(val: string): Promise<number>;
|
|
56
|
+
export declare function getRecentRecords(collection: string, limit: number): Promise<any[]>;
|
|
49
57
|
export declare function getSchemaDump(): Promise<string>;
|
|
50
58
|
export declare function buildInsertOp(collection: string, uri: string, cid: string, authorDid: string, record: Record<string, any>): {
|
|
51
59
|
sql: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"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"}
|
package/dist/database/db.js
CHANGED
|
@@ -344,6 +344,17 @@ export async function listPendingRepos() {
|
|
|
344
344
|
const rows = await all(`SELECT did FROM _repos WHERE status = 'pending'`);
|
|
345
345
|
return rows.map((r) => r.did);
|
|
346
346
|
}
|
|
347
|
+
export async function listActiveRepoDids() {
|
|
348
|
+
const rows = await all(`SELECT did FROM _repos WHERE status = 'active'`);
|
|
349
|
+
return rows.map((r) => r.did);
|
|
350
|
+
}
|
|
351
|
+
export async function removeRepo(did) {
|
|
352
|
+
await run(`DELETE FROM _repos WHERE did = $1`, [did]);
|
|
353
|
+
}
|
|
354
|
+
export async function getRepoHandle(did) {
|
|
355
|
+
const rows = await all(`SELECT handle FROM _repos WHERE did = $1`, [did]);
|
|
356
|
+
return rows[0]?.handle ?? null;
|
|
357
|
+
}
|
|
347
358
|
export async function listAllRepoStatuses() {
|
|
348
359
|
return (await all(`SELECT did, status FROM _repos`));
|
|
349
360
|
}
|
|
@@ -375,6 +386,44 @@ export async function getCollectionCounts() {
|
|
|
375
386
|
}
|
|
376
387
|
return counts;
|
|
377
388
|
}
|
|
389
|
+
export async function getRepoStatusCounts() {
|
|
390
|
+
const rows = await all(`SELECT status, ${dialect.countAsInteger} as count FROM _repos GROUP BY status`);
|
|
391
|
+
const counts = {};
|
|
392
|
+
for (const row of rows)
|
|
393
|
+
counts[row.status] = Number(row.count);
|
|
394
|
+
return counts;
|
|
395
|
+
}
|
|
396
|
+
export async function getDatabaseSize() {
|
|
397
|
+
if (dialect.supportsSequences) {
|
|
398
|
+
// DuckDB: pragma_database_size returns pre-formatted strings
|
|
399
|
+
const rows = await all('SELECT database_size, memory_usage, memory_limit FROM pragma_database_size()');
|
|
400
|
+
return rows[0] ?? {};
|
|
401
|
+
}
|
|
402
|
+
// SQLite: compute from page_count * page_size
|
|
403
|
+
const pages = await all('SELECT page_count FROM pragma_page_count()');
|
|
404
|
+
const sizes = await all('SELECT page_size FROM pragma_page_size()');
|
|
405
|
+
const pageCount = Number(pages[0]?.page_count ?? 0);
|
|
406
|
+
const pageSize = Number(sizes[0]?.page_size ?? 0);
|
|
407
|
+
const bytes = pageCount * pageSize;
|
|
408
|
+
const mib = (bytes / 1024 / 1024).toFixed(1);
|
|
409
|
+
return { database_size: `${mib} MiB`, memory_usage: 'N/A', memory_limit: 'N/A' };
|
|
410
|
+
}
|
|
411
|
+
export async function getLabelCount(val) {
|
|
412
|
+
const rows = await all(`SELECT ${dialect.countAsInteger} as count FROM _labels WHERE val = $1`, [val]);
|
|
413
|
+
return Number(rows[0]?.count || 0);
|
|
414
|
+
}
|
|
415
|
+
export async function deleteLabels(val) {
|
|
416
|
+
const count = await getLabelCount(val);
|
|
417
|
+
await run(`DELETE FROM _labels WHERE val = $1`, [val]);
|
|
418
|
+
return count;
|
|
419
|
+
}
|
|
420
|
+
export async function getRecentRecords(collection, limit) {
|
|
421
|
+
const schema = schemas.get(collection);
|
|
422
|
+
if (!schema)
|
|
423
|
+
return [];
|
|
424
|
+
const rows = await all(`SELECT t.* FROM ${schema.tableName} t JOIN _repos r ON t.did = r.did WHERE t.indexed_at > r.backfilled_at ORDER BY t.indexed_at DESC LIMIT $1`, [limit]);
|
|
425
|
+
return rows;
|
|
426
|
+
}
|
|
378
427
|
export async function getSchemaDump() {
|
|
379
428
|
let rows;
|
|
380
429
|
if (dialect.supportsSequences) {
|
|
@@ -430,7 +479,7 @@ export function buildInsertOp(collection, uri, cid, authorDid, record) {
|
|
|
430
479
|
if (rawValue === undefined || rawValue === null) {
|
|
431
480
|
values.push(null);
|
|
432
481
|
}
|
|
433
|
-
else if (col.
|
|
482
|
+
else if (col.isJson) {
|
|
434
483
|
values.push(JSON.stringify(rawValue));
|
|
435
484
|
}
|
|
436
485
|
else {
|
|
@@ -465,7 +514,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
465
514
|
if (raw === undefined || raw === null) {
|
|
466
515
|
values.push(null);
|
|
467
516
|
}
|
|
468
|
-
else if (col.
|
|
517
|
+
else if (col.isJson) {
|
|
469
518
|
values.push(JSON.stringify(raw));
|
|
470
519
|
}
|
|
471
520
|
else {
|
|
@@ -504,7 +553,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
504
553
|
if (raw === undefined || raw === null) {
|
|
505
554
|
values.push(null);
|
|
506
555
|
}
|
|
507
|
-
else if (col.
|
|
556
|
+
else if (col.isJson) {
|
|
508
557
|
values.push(JSON.stringify(raw));
|
|
509
558
|
}
|
|
510
559
|
else {
|
|
@@ -528,7 +577,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
528
577
|
if (raw === undefined || raw === null) {
|
|
529
578
|
values.push(null);
|
|
530
579
|
}
|
|
531
|
-
else if (col.
|
|
580
|
+
else if (col.isJson) {
|
|
532
581
|
values.push(JSON.stringify(raw));
|
|
533
582
|
}
|
|
534
583
|
else {
|
|
@@ -1218,7 +1267,7 @@ export function reshapeRow(row, childData, unionData) {
|
|
|
1218
1267
|
if (schema) {
|
|
1219
1268
|
for (const col of schema.columns) {
|
|
1220
1269
|
nameMap.set(col.name, col.originalName);
|
|
1221
|
-
if (col.
|
|
1270
|
+
if (col.isJson)
|
|
1222
1271
|
jsonCols.add(col.name);
|
|
1223
1272
|
}
|
|
1224
1273
|
}
|
package/dist/database/fts.js
CHANGED
|
@@ -106,7 +106,7 @@ function computeFtsSchema(collection) {
|
|
|
106
106
|
selectExprs.push(`t.${col.name}`);
|
|
107
107
|
searchColNames.push(col.name);
|
|
108
108
|
}
|
|
109
|
-
else if (
|
|
109
|
+
else if (col.isJson && record?.properties) {
|
|
110
110
|
const prop = record.properties[col.originalName];
|
|
111
111
|
if (prop?.type === 'blob')
|
|
112
112
|
continue; // skip blobs
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/database/schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAG9C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;IACpB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,QAAQ,EAAE,gBAAgB,EAAE,CAAA;IAC5B,MAAM,EAAE,gBAAgB,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,SAAS,EAAE,CAAA;CACrB;AAGD,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AA+CD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CASlE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CASxE;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAI9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS,CAExD;AAED,wBAAgB,cAAc,IAAI,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,GAAG,CAAA;CAAE,CAAC,CAEtE;AAED,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,GAAG,EAAE,CAEvC;AAyHD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,GAAG,EACZ,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,GAAE,UAA2B,GACnC,WAAW,CA+Gb;AAGD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,UAA2B,GAAG,MAAM,CAoExG;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,UAA2B,GACnC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrD"}
|