@hatk/hatk 0.0.1-alpha.42 → 0.0.1-alpha.44
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/cli.js +3 -19
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +18 -18
- package/dist/database/fts.js +6 -6
- package/dist/database/schema.d.ts +1 -0
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +10 -6
- package/dist/lexicons/dev/hatk/describeLabels.json +24 -10
- package/dist/oauth/db.d.ts +2 -1
- package/dist/oauth/db.d.ts.map +1 -1
- package/dist/oauth/db.js +4 -2
- package/dist/oauth/server.d.ts.map +1 -1
- package/dist/oauth/server.js +8 -2
- package/dist/pds-proxy.d.ts.map +1 -1
- package/dist/pds-proxy.js +4 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { mkdirSync, writeFileSync, existsSync, unlinkSync, readdirSync, readFileSync, cpSync } from 'node:fs';
|
|
3
|
-
import { resolve, join
|
|
3
|
+
import { resolve, join } from 'node:path';
|
|
4
4
|
import { execSync, spawn } from 'node:child_process';
|
|
5
|
-
import { loadLexicons
|
|
5
|
+
import { loadLexicons } from "./database/schema.js";
|
|
6
6
|
import { loadConfig } from "./config.js";
|
|
7
7
|
const args = process.argv.slice(2);
|
|
8
8
|
const command = args[0];
|
|
@@ -77,7 +77,6 @@ function usage() {
|
|
|
77
77
|
dev Start PDS, seed, and run hatk
|
|
78
78
|
seed Seed local PDS with fixture data
|
|
79
79
|
reset Reset database and PDS for a clean slate
|
|
80
|
-
schema Show database schema from lexicons
|
|
81
80
|
|
|
82
81
|
Code Quality
|
|
83
82
|
check Type-check and lint the project
|
|
@@ -1059,6 +1058,7 @@ else if (command === 'generate') {
|
|
|
1059
1058
|
clientOut += ` const blob = arg as Blob | ArrayBuffer\n`;
|
|
1060
1059
|
clientOut += ` const ct = blob instanceof Blob ? blob.type : 'application/octet-stream'\n`;
|
|
1061
1060
|
clientOut += ` const res = await _fetch(path, { method: 'POST', headers: { 'Content-Type': ct }, body: blob })\n`;
|
|
1061
|
+
clientOut += ` if (typeof window !== 'undefined' && res.status === 401) { const _b = await res.json().catch(() => ({})); const _h = _b.handle ?? getViewer()?.handle; window.location.href = _h ? \`/oauth/login?handle=\${encodeURIComponent(_h)}\` : '/oauth/login'; return new Promise(() => {}) as any }\n`;
|
|
1062
1062
|
clientOut += ` if (!res.ok) throw new Error(\`XRPC \${nsid} failed: \${res.status}\`)\n`;
|
|
1063
1063
|
clientOut += ` return res.json() as Promise<OutputOf<K>>\n`;
|
|
1064
1064
|
clientOut += ` }\n`;
|
|
@@ -1395,22 +1395,6 @@ else if (command === 'resolve') {
|
|
|
1395
1395
|
console.log(`\nResolved ${resolved.size} lexicon(s). Regenerating types...`);
|
|
1396
1396
|
execSync('npx hatk generate types', { stdio: 'inherit', cwd: process.cwd() });
|
|
1397
1397
|
}
|
|
1398
|
-
else if (command === 'schema') {
|
|
1399
|
-
const config = await loadConfig(resolve('hatk.config.ts'));
|
|
1400
|
-
const { initDatabase, getSchemaDump } = await import("./database/db.js");
|
|
1401
|
-
const { createAdapter } = await import("./database/adapter-factory.js");
|
|
1402
|
-
const { getDialect } = await import("./database/dialect.js");
|
|
1403
|
-
const configDir2 = resolve('.');
|
|
1404
|
-
const lexicons2 = loadLexicons(resolve(configDir2, 'lexicons'));
|
|
1405
|
-
const collections2 = config.collections.length > 0 ? config.collections : discoverCollections(lexicons2);
|
|
1406
|
-
const { schemas: schemas2, ddlStatements: ddl2 } = buildSchemas(lexicons2, collections2, getDialect(config.databaseEngine));
|
|
1407
|
-
if (config.database !== ':memory:') {
|
|
1408
|
-
mkdirSync(dirname(config.database), { recursive: true });
|
|
1409
|
-
}
|
|
1410
|
-
const { adapter: adapter2 } = await createAdapter(config.databaseEngine);
|
|
1411
|
-
await initDatabase(adapter2, config.database, schemas2, ddl2);
|
|
1412
|
-
console.log(await getSchemaDump());
|
|
1413
|
-
}
|
|
1414
1398
|
else if (command === 'start') {
|
|
1415
1399
|
const mainPath = resolve(import.meta.dirname, 'main.js');
|
|
1416
1400
|
await spawnForward('npx', ['tsx', mainPath, 'hatk.config.ts']);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,
|
|
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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toSnakeCase } from "./schema.js";
|
|
1
|
+
import { toSnakeCase, q } from "./schema.js";
|
|
2
2
|
import { getSearchColumns, stripStopWords, getSearchPort, updateFtsRecord, deleteFtsRecord } from "./fts.js";
|
|
3
3
|
import { emit, timer } from "../logger.js";
|
|
4
4
|
import { OAUTH_DDL } from "../oauth/db.js";
|
|
@@ -508,7 +508,7 @@ export function buildInsertOp(collection, uri, cid, authorDid, record) {
|
|
|
508
508
|
else if (col.originalName.endsWith('__cid') && record[col.originalName.replace('__cid', '')]) {
|
|
509
509
|
rawValue = record[col.originalName.replace('__cid', '')].cid;
|
|
510
510
|
}
|
|
511
|
-
colNames.push(col.name);
|
|
511
|
+
colNames.push(q(col.name));
|
|
512
512
|
placeholders.push(`$${paramIdx++}`);
|
|
513
513
|
if (rawValue === undefined || rawValue === null) {
|
|
514
514
|
values.push(null);
|
|
@@ -542,7 +542,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
542
542
|
const values = [uri, authorDid];
|
|
543
543
|
let idx = 3;
|
|
544
544
|
for (const col of child.columns) {
|
|
545
|
-
colNames.push(col.name);
|
|
545
|
+
colNames.push(q(col.name));
|
|
546
546
|
placeholders.push(`$${idx++}`);
|
|
547
547
|
const raw = item[col.originalName];
|
|
548
548
|
if (raw === undefined || raw === null) {
|
|
@@ -581,7 +581,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
581
581
|
const values = [uri, authorDid];
|
|
582
582
|
let idx = 3;
|
|
583
583
|
for (const col of branch.columns) {
|
|
584
|
-
colNames.push(col.name);
|
|
584
|
+
colNames.push(q(col.name));
|
|
585
585
|
placeholders.push(`$${idx++}`);
|
|
586
586
|
const raw = item[col.originalName];
|
|
587
587
|
if (raw === undefined || raw === null) {
|
|
@@ -605,7 +605,7 @@ export async function insertRecord(collection, uri, cid, authorDid, record) {
|
|
|
605
605
|
const values = [uri, authorDid];
|
|
606
606
|
let idx = 3;
|
|
607
607
|
for (const col of branch.columns) {
|
|
608
|
-
colNames.push(col.name);
|
|
608
|
+
colNames.push(q(col.name));
|
|
609
609
|
placeholders.push(`$${idx++}`);
|
|
610
610
|
const raw = branchData[col.originalName];
|
|
611
611
|
if (raw === undefined || raw === null) {
|
|
@@ -704,7 +704,7 @@ export async function bulkInsertRecords(records) {
|
|
|
704
704
|
if (!schema)
|
|
705
705
|
continue;
|
|
706
706
|
const stagingTable = `_staging_${collection.replace(/\./g, '_')}`;
|
|
707
|
-
const allCols = ['uri', 'cid', 'did', 'indexed_at', ...schema.columns.map((c) => c.name)];
|
|
707
|
+
const allCols = ['uri', 'cid', 'did', 'indexed_at', ...schema.columns.map((c) => q(c.name))];
|
|
708
708
|
const colDefs = [
|
|
709
709
|
'uri TEXT',
|
|
710
710
|
'cid TEXT',
|
|
@@ -713,7 +713,7 @@ export async function bulkInsertRecords(records) {
|
|
|
713
713
|
...schema.columns.map((c) => {
|
|
714
714
|
const t = c.sqlType;
|
|
715
715
|
// Use TEXT for timestamp columns in staging (will cast on merge)
|
|
716
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
716
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
717
717
|
}),
|
|
718
718
|
];
|
|
719
719
|
await port.execute(`DROP TABLE IF EXISTS ${stagingTable}`, []);
|
|
@@ -736,7 +736,7 @@ export async function bulkInsertRecords(records) {
|
|
|
736
736
|
await inserter.close();
|
|
737
737
|
// Merge into target, filtering rows that would violate NOT NULL
|
|
738
738
|
const selectCols = allCols.map((name) => {
|
|
739
|
-
const col = schema.columns.find((c) => c.name === name);
|
|
739
|
+
const col = schema.columns.find((c) => q(c.name) === name);
|
|
740
740
|
if (name === 'indexed_at' || (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ'))) {
|
|
741
741
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
742
742
|
}
|
|
@@ -746,10 +746,10 @@ export async function bulkInsertRecords(records) {
|
|
|
746
746
|
for (const col of schema.columns) {
|
|
747
747
|
if (col.notNull) {
|
|
748
748
|
if (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ') {
|
|
749
|
-
notNullChecks.push(`${dialect.tryCastTimestamp(col.name)} IS NOT NULL`);
|
|
749
|
+
notNullChecks.push(`${dialect.tryCastTimestamp(q(col.name))} IS NOT NULL`);
|
|
750
750
|
}
|
|
751
751
|
else {
|
|
752
|
-
notNullChecks.push(`${col.name} IS NOT NULL`);
|
|
752
|
+
notNullChecks.push(`${q(col.name)} IS NOT NULL`);
|
|
753
753
|
}
|
|
754
754
|
}
|
|
755
755
|
}
|
|
@@ -764,10 +764,10 @@ export async function bulkInsertRecords(records) {
|
|
|
764
764
|
'parent_did TEXT',
|
|
765
765
|
...child.columns.map((c) => {
|
|
766
766
|
const t = c.sqlType;
|
|
767
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
767
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
768
768
|
}),
|
|
769
769
|
];
|
|
770
|
-
const childAllCols = ['parent_uri', 'parent_did', ...child.columns.map((c) => c.name)];
|
|
770
|
+
const childAllCols = ['parent_uri', 'parent_did', ...child.columns.map((c) => q(c.name))];
|
|
771
771
|
await port.execute(`DROP TABLE IF EXISTS ${childStagingTable}`, []);
|
|
772
772
|
await port.execute(`CREATE TABLE ${childStagingTable} (${childColDefs.join(', ')})`, []);
|
|
773
773
|
const childInserter = await port.createBulkInserter(childStagingTable, childAllCols);
|
|
@@ -793,7 +793,7 @@ export async function bulkInsertRecords(records) {
|
|
|
793
793
|
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
794
794
|
await port.execute(`DELETE FROM ${child.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
795
795
|
const childSelectCols = childAllCols.map((name) => {
|
|
796
|
-
const col = child.columns.find((c) => c.name === name);
|
|
796
|
+
const col = child.columns.find((c) => q(c.name) === name);
|
|
797
797
|
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
798
798
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
799
799
|
}
|
|
@@ -811,10 +811,10 @@ export async function bulkInsertRecords(records) {
|
|
|
811
811
|
'parent_did TEXT',
|
|
812
812
|
...branch.columns.map((c) => {
|
|
813
813
|
const t = c.sqlType;
|
|
814
|
-
return `${c.name} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
814
|
+
return `${q(c.name)} ${t === 'TIMESTAMP' || t === 'TIMESTAMPTZ' ? 'TEXT' : t}`;
|
|
815
815
|
}),
|
|
816
816
|
];
|
|
817
|
-
const branchAllCols = ['parent_uri', 'parent_did', ...branch.columns.map((c) => c.name)];
|
|
817
|
+
const branchAllCols = ['parent_uri', 'parent_did', ...branch.columns.map((c) => q(c.name))];
|
|
818
818
|
await port.execute(`DROP TABLE IF EXISTS ${branchStagingTable}`, []);
|
|
819
819
|
await port.execute(`CREATE TABLE ${branchStagingTable} (${branchColDefs.join(', ')})`, []);
|
|
820
820
|
const branchInserter = await port.createBulkInserter(branchStagingTable, branchAllCols);
|
|
@@ -860,7 +860,7 @@ export async function bulkInsertRecords(records) {
|
|
|
860
860
|
const uriPlaceholders = recs.map((_, i) => `$${i + 1}`).join(',');
|
|
861
861
|
await port.execute(`DELETE FROM ${branch.tableName} WHERE parent_uri IN (${uriPlaceholders})`, recs.map((r) => r.uri));
|
|
862
862
|
const branchSelectCols = branchAllCols.map((name) => {
|
|
863
|
-
const col = branch.columns.find((c) => c.name === name);
|
|
863
|
+
const col = branch.columns.find((c) => q(c.name) === name);
|
|
864
864
|
if (col && (col.sqlType === 'TIMESTAMP' || col.sqlType === 'TIMESTAMPTZ')) {
|
|
865
865
|
return `${dialect.tryCastTimestamp(name)} AS ${name}`;
|
|
866
866
|
}
|
|
@@ -1138,14 +1138,14 @@ export async function searchRecords(collection, query, opts = {}) {
|
|
|
1138
1138
|
const remaining = limit - bm25Results.length;
|
|
1139
1139
|
const jwFn = dialect.jaroWinklerSimilarity;
|
|
1140
1140
|
const simExprs = [
|
|
1141
|
-
...textCols.map((c) => `${jwFn}(lower(t.${c.name}), lower($1))`),
|
|
1141
|
+
...textCols.map((c) => `${jwFn}(lower(t.${q(c.name)}), lower($1))`),
|
|
1142
1142
|
`${jwFn}(lower(r.handle), lower($1))`,
|
|
1143
1143
|
];
|
|
1144
1144
|
// Include child table TEXT columns via correlated subquery
|
|
1145
1145
|
for (const child of schema.children) {
|
|
1146
1146
|
for (const col of child.columns) {
|
|
1147
1147
|
if (col.sqlType === 'TEXT') {
|
|
1148
|
-
simExprs.push(`COALESCE((SELECT MAX(${jwFn}(lower(c.${col.name}), lower($1))) FROM ${child.tableName} c WHERE c.parent_uri = t.uri), 0)`);
|
|
1148
|
+
simExprs.push(`COALESCE((SELECT MAX(${jwFn}(lower(c.${q(col.name)}), lower($1))) FROM ${child.tableName} c WHERE c.parent_uri = t.uri), 0)`);
|
|
1149
1149
|
}
|
|
1150
1150
|
}
|
|
1151
1151
|
}
|
package/dist/database/fts.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSchema, runSQL, getSqlDialect, querySQL } from "./db.js";
|
|
2
|
-
import { getLexicon } from "./schema.js";
|
|
2
|
+
import { getLexicon, q } from "./schema.js";
|
|
3
3
|
import { emit, timer } from "../logger.js";
|
|
4
4
|
/**
|
|
5
5
|
* Resolve a lexicon ref like "#artist" to its definition.
|
|
@@ -103,7 +103,7 @@ function computeFtsSchema(collection) {
|
|
|
103
103
|
const searchColNames = [];
|
|
104
104
|
for (const col of schema.columns) {
|
|
105
105
|
if (col.sqlType === 'TEXT') {
|
|
106
|
-
selectExprs.push(`t.${col.name}`);
|
|
106
|
+
selectExprs.push(`t.${q(col.name)}`);
|
|
107
107
|
searchColNames.push(col.name);
|
|
108
108
|
}
|
|
109
109
|
else if (col.isJson && record?.properties) {
|
|
@@ -111,7 +111,7 @@ function computeFtsSchema(collection) {
|
|
|
111
111
|
if (prop?.type === 'blob')
|
|
112
112
|
continue; // skip blobs
|
|
113
113
|
if (prop && lexicon) {
|
|
114
|
-
const derived = jsonSearchColumns(`t.${col.name}`, prop, lexicon, dialect);
|
|
114
|
+
const derived = jsonSearchColumns(`t.${q(col.name)}`, prop, lexicon, dialect);
|
|
115
115
|
if (derived.length > 0) {
|
|
116
116
|
for (const d of derived) {
|
|
117
117
|
selectExprs.push(`${d.expr} AS ${d.alias}`);
|
|
@@ -121,7 +121,7 @@ function computeFtsSchema(collection) {
|
|
|
121
121
|
}
|
|
122
122
|
}
|
|
123
123
|
// Fallback: cast JSON to TEXT
|
|
124
|
-
selectExprs.push(`CAST(t.${col.name} AS TEXT) AS ${col.name}`);
|
|
124
|
+
selectExprs.push(`CAST(t.${q(col.name)} AS TEXT) AS ${q(col.name)}`);
|
|
125
125
|
searchColNames.push(col.name);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -130,7 +130,7 @@ function computeFtsSchema(collection) {
|
|
|
130
130
|
for (const col of child.columns) {
|
|
131
131
|
if (col.sqlType === 'TEXT') {
|
|
132
132
|
const alias = `${child.fieldName}_${col.name}`;
|
|
133
|
-
const agg = dialect.stringAgg(`c.${col.name}`, "' '");
|
|
133
|
+
const agg = dialect.stringAgg(`c.${q(col.name)}`, "' '");
|
|
134
134
|
selectExprs.push(`(SELECT ${agg} FROM ${child.tableName} c WHERE c.parent_uri = t.uri) AS ${alias}`);
|
|
135
135
|
searchColNames.push(alias);
|
|
136
136
|
}
|
|
@@ -142,7 +142,7 @@ function computeFtsSchema(collection) {
|
|
|
142
142
|
for (const col of branch.columns) {
|
|
143
143
|
if (col.sqlType === 'TEXT') {
|
|
144
144
|
const alias = `${union.fieldName}_${branch.branchName}_${col.name}`;
|
|
145
|
-
const agg = dialect.stringAgg(`c.${col.name}`, "' '");
|
|
145
|
+
const agg = dialect.stringAgg(`c.${q(col.name)}`, "' '");
|
|
146
146
|
selectExprs.push(`(SELECT ${agg} FROM ${branch.tableName} c WHERE c.parent_uri = t.uri) AS ${alias}`);
|
|
147
147
|
searchColNames.push(alias);
|
|
148
148
|
}
|
|
@@ -35,6 +35,7 @@ export interface ChildTableSchema {
|
|
|
35
35
|
columns: ColumnDef[];
|
|
36
36
|
}
|
|
37
37
|
export declare function toSnakeCase(str: string): string;
|
|
38
|
+
export declare function q(name: string): string;
|
|
38
39
|
export declare function loadLexicons(lexiconsDir: string): Map<string, any>;
|
|
39
40
|
/**
|
|
40
41
|
* Discover collections by scanning lexicons for record-type definitions.
|
|
@@ -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;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"}
|
|
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;AAGD,wBAAgB,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtC;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"}
|
package/dist/database/schema.js
CHANGED
|
@@ -5,6 +5,10 @@ import { DUCKDB_DIALECT } from "./dialect.js";
|
|
|
5
5
|
export function toSnakeCase(str) {
|
|
6
6
|
return str.replace(/([A-Z])/g, '_$1').toLowerCase();
|
|
7
7
|
}
|
|
8
|
+
// Quote a column name to avoid conflicts with SQL reserved words
|
|
9
|
+
export function q(name) {
|
|
10
|
+
return `"${name}"`;
|
|
11
|
+
}
|
|
8
12
|
function mapType(prop, dialect) {
|
|
9
13
|
if (prop.type === 'string') {
|
|
10
14
|
if (prop.format === 'datetime')
|
|
@@ -312,7 +316,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
312
316
|
];
|
|
313
317
|
for (const col of schema.columns) {
|
|
314
318
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
315
|
-
lines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
319
|
+
lines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
316
320
|
}
|
|
317
321
|
const createTable = `CREATE TABLE IF NOT EXISTS ${schema.tableName} (\n${lines.join(',\n')}\n);`;
|
|
318
322
|
const prefix = schema.collection.replace(/\./g, '_');
|
|
@@ -322,7 +326,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
322
326
|
];
|
|
323
327
|
// Index ref columns for hydration lookups
|
|
324
328
|
for (const refCol of schema.refColumns) {
|
|
325
|
-
indexes.push(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${refCol} ON ${schema.tableName}(${refCol});`);
|
|
329
|
+
indexes.push(`CREATE INDEX IF NOT EXISTS idx_${prefix}_${refCol} ON ${schema.tableName}(${q(refCol)});`);
|
|
326
330
|
}
|
|
327
331
|
// Child table DDL
|
|
328
332
|
const childDDL = [];
|
|
@@ -330,7 +334,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
330
334
|
const childLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
331
335
|
for (const col of child.columns) {
|
|
332
336
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
333
|
-
childLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
337
|
+
childLines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
334
338
|
}
|
|
335
339
|
childDDL.push(`CREATE TABLE IF NOT EXISTS ${child.tableName} (\n${childLines.join(',\n')}\n);`);
|
|
336
340
|
const childPrefix = `${prefix}__${toSnakeCase(child.fieldName)}`;
|
|
@@ -339,7 +343,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
339
343
|
for (const col of child.columns) {
|
|
340
344
|
if (col.isJson || col.sqlType === 'BLOB')
|
|
341
345
|
continue;
|
|
342
|
-
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${col.name});`);
|
|
346
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${childPrefix}_${col.name} ON ${child.tableName}(${q(col.name)});`);
|
|
343
347
|
}
|
|
344
348
|
}
|
|
345
349
|
// Union branch table DDL
|
|
@@ -348,7 +352,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
348
352
|
const branchLines = [' parent_uri TEXT NOT NULL', ' parent_did TEXT NOT NULL'];
|
|
349
353
|
for (const col of branch.columns) {
|
|
350
354
|
const nullable = col.notNull ? ' NOT NULL' : '';
|
|
351
|
-
branchLines.push(` ${col.name} ${col.sqlType}${nullable}`);
|
|
355
|
+
branchLines.push(` ${q(col.name)} ${col.sqlType}${nullable}`);
|
|
352
356
|
}
|
|
353
357
|
childDDL.push(`CREATE TABLE IF NOT EXISTS ${branch.tableName} (\n${branchLines.join(',\n')}\n);`);
|
|
354
358
|
const branchPrefix = branch.tableName.replace(/"/g, '').replace(/\./g, '_');
|
|
@@ -357,7 +361,7 @@ export function generateCreateTableSQL(schema, dialect = DUCKDB_DIALECT) {
|
|
|
357
361
|
for (const col of branch.columns) {
|
|
358
362
|
if (col.isJson || col.sqlType === 'BLOB')
|
|
359
363
|
continue;
|
|
360
|
-
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${col.name});`);
|
|
364
|
+
childDDL.push(`CREATE INDEX IF NOT EXISTS idx_${branchPrefix}_${col.name} ON ${branch.tableName}(${q(col.name)});`);
|
|
361
365
|
}
|
|
362
366
|
}
|
|
363
367
|
}
|
|
@@ -12,20 +12,34 @@
|
|
|
12
12
|
"properties": {
|
|
13
13
|
"definitions": {
|
|
14
14
|
"type": "array",
|
|
15
|
-
"items": {
|
|
16
|
-
"type": "object",
|
|
17
|
-
"required": ["identifier", "severity", "blurs", "defaultSetting"],
|
|
18
|
-
"properties": {
|
|
19
|
-
"identifier": { "type": "string" },
|
|
20
|
-
"severity": { "type": "string" },
|
|
21
|
-
"blurs": { "type": "string" },
|
|
22
|
-
"defaultSetting": { "type": "string" }
|
|
23
|
-
}
|
|
24
|
-
}
|
|
15
|
+
"items": { "type": "ref", "ref": "#labelDefinition" }
|
|
25
16
|
}
|
|
26
17
|
}
|
|
27
18
|
}
|
|
28
19
|
}
|
|
20
|
+
},
|
|
21
|
+
"labelDefinition": {
|
|
22
|
+
"type": "object",
|
|
23
|
+
"required": ["identifier", "severity", "blurs", "defaultSetting"],
|
|
24
|
+
"properties": {
|
|
25
|
+
"identifier": { "type": "string" },
|
|
26
|
+
"severity": { "type": "string" },
|
|
27
|
+
"blurs": { "type": "string" },
|
|
28
|
+
"defaultSetting": { "type": "string" },
|
|
29
|
+
"locales": {
|
|
30
|
+
"type": "array",
|
|
31
|
+
"items": { "type": "ref", "ref": "#labelLocale" }
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"labelLocale": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"required": ["lang", "name", "description"],
|
|
38
|
+
"properties": {
|
|
39
|
+
"lang": { "type": "string" },
|
|
40
|
+
"name": { "type": "string" },
|
|
41
|
+
"description": { "type": "string" }
|
|
42
|
+
}
|
|
29
43
|
}
|
|
30
44
|
}
|
|
31
45
|
}
|
package/dist/oauth/db.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const OAUTH_DDL = "\nCREATE TABLE IF NOT EXISTS _oauth_keys (\n kid TEXT PRIMARY KEY,\n private_key TEXT NOT NULL,\n public_key TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_sessions (\n did TEXT PRIMARY KEY,\n pds_endpoint TEXT NOT NULL,\n access_token TEXT NOT NULL,\n refresh_token TEXT,\n dpop_jkt TEXT NOT NULL,\n token_expires_at INTEGER,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_requests (\n request_uri TEXT PRIMARY KEY,\n client_id TEXT NOT NULL,\n redirect_uri TEXT NOT NULL,\n scope TEXT,\n state TEXT,\n code_challenge TEXT NOT NULL,\n code_challenge_method TEXT NOT NULL DEFAULT 'S256',\n dpop_jkt TEXT NOT NULL,\n pds_request_uri TEXT,\n pds_auth_server TEXT,\n pds_code_verifier TEXT,\n pds_state TEXT,\n did TEXT,\n login_hint TEXT,\n expires_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_codes (\n code TEXT PRIMARY KEY,\n request_uri TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_refresh_tokens (\n token TEXT PRIMARY KEY,\n client_id TEXT NOT NULL,\n did TEXT NOT NULL,\n dpop_jkt TEXT NOT NULL,\n scope TEXT,\n created_at INTEGER NOT NULL,\n expires_at INTEGER,\n revoked INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_dpop_jtis (\n jti TEXT PRIMARY KEY,\n expires_at INTEGER NOT NULL\n);\n";
|
|
1
|
+
export declare const OAUTH_DDL = "\nCREATE TABLE IF NOT EXISTS _oauth_keys (\n kid TEXT PRIMARY KEY,\n private_key TEXT NOT NULL,\n public_key TEXT NOT NULL,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_sessions (\n did TEXT PRIMARY KEY,\n pds_endpoint TEXT NOT NULL,\n access_token TEXT NOT NULL,\n refresh_token TEXT,\n dpop_jkt TEXT NOT NULL,\n token_expires_at INTEGER,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_requests (\n request_uri TEXT PRIMARY KEY,\n client_id TEXT NOT NULL,\n redirect_uri TEXT NOT NULL,\n scope TEXT,\n state TEXT,\n code_challenge TEXT NOT NULL,\n code_challenge_method TEXT NOT NULL DEFAULT 'S256',\n dpop_jkt TEXT NOT NULL,\n pds_request_uri TEXT,\n pds_auth_server TEXT,\n pds_endpoint TEXT,\n pds_code_verifier TEXT,\n pds_state TEXT,\n did TEXT,\n login_hint TEXT,\n expires_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_codes (\n code TEXT PRIMARY KEY,\n request_uri TEXT NOT NULL,\n created_at INTEGER NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_refresh_tokens (\n token TEXT PRIMARY KEY,\n client_id TEXT NOT NULL,\n did TEXT NOT NULL,\n dpop_jkt TEXT NOT NULL,\n scope TEXT,\n created_at INTEGER NOT NULL,\n expires_at INTEGER,\n revoked INTEGER NOT NULL DEFAULT 0\n);\n\nCREATE TABLE IF NOT EXISTS _oauth_dpop_jtis (\n jti TEXT PRIMARY KEY,\n expires_at INTEGER NOT NULL\n);\n";
|
|
2
2
|
export declare function getServerKey(kid: string): Promise<{
|
|
3
3
|
privateKey: string;
|
|
4
4
|
publicKey: string;
|
|
@@ -14,6 +14,7 @@ export declare function storeOAuthRequest(requestUri: string, data: {
|
|
|
14
14
|
dpopJkt: string;
|
|
15
15
|
pdsRequestUri?: string;
|
|
16
16
|
pdsAuthServer?: string;
|
|
17
|
+
pdsEndpoint?: string;
|
|
17
18
|
pdsCodeVerifier?: string;
|
|
18
19
|
pdsState?: string;
|
|
19
20
|
did?: string;
|
package/dist/oauth/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/oauth/db.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/oauth/db.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,o9CA2DrB,CAAA;AAID,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAIzG;AAED,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMtG;AAID,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB,GACA,OAAO,CAAC,IAAI,CAAC,CAuBf;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAM7E;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAID,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnF;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK1E;AAID,wBAAsB,YAAY,CAChC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IACJ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,GACA,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGjE;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAID,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACJ,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GACA,OAAO,CAAC,IAAI,CAAC,CAQf;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAGxE;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAID,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAK3F;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQzD"}
|
package/dist/oauth/db.js
CHANGED
|
@@ -31,6 +31,7 @@ CREATE TABLE IF NOT EXISTS _oauth_requests (
|
|
|
31
31
|
dpop_jkt TEXT NOT NULL,
|
|
32
32
|
pds_request_uri TEXT,
|
|
33
33
|
pds_auth_server TEXT,
|
|
34
|
+
pds_endpoint TEXT,
|
|
34
35
|
pds_code_verifier TEXT,
|
|
35
36
|
pds_state TEXT,
|
|
36
37
|
did TEXT,
|
|
@@ -76,8 +77,8 @@ export async function storeServerKey(kid, privateKey, publicKey) {
|
|
|
76
77
|
}
|
|
77
78
|
// --- OAuth Request Storage ---
|
|
78
79
|
export async function storeOAuthRequest(requestUri, data) {
|
|
79
|
-
await runSQL(`INSERT INTO _oauth_requests (request_uri, client_id, redirect_uri, scope, state, code_challenge, code_challenge_method, dpop_jkt, pds_request_uri, pds_auth_server, pds_code_verifier, pds_state, did, login_hint, expires_at)
|
|
80
|
-
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15)`, [
|
|
80
|
+
await runSQL(`INSERT INTO _oauth_requests (request_uri, client_id, redirect_uri, scope, state, code_challenge, code_challenge_method, dpop_jkt, pds_request_uri, pds_auth_server, pds_endpoint, pds_code_verifier, pds_state, did, login_hint, expires_at)
|
|
81
|
+
VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16)`, [
|
|
81
82
|
requestUri,
|
|
82
83
|
data.clientId,
|
|
83
84
|
data.redirectUri,
|
|
@@ -88,6 +89,7 @@ export async function storeOAuthRequest(requestUri, data) {
|
|
|
88
89
|
data.dpopJkt,
|
|
89
90
|
data.pdsRequestUri || null,
|
|
90
91
|
data.pdsAuthServer || null,
|
|
92
|
+
data.pdsEndpoint || null,
|
|
91
93
|
data.pdsCodeVerifier || null,
|
|
92
94
|
data.pdsState || null,
|
|
93
95
|
data.did || null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/oauth/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AA4E/C,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrG;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;;EAqBxE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;EAO/E;AAED,wBAAgB,OAAO;;;;;;;;;;;;;;;;;;;;;;EAWtB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;;;;;EAcpE;AAID,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/oauth/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AA4E/C,wBAAsB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBrG;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;;;;;;;;;;;;;;;EAqBxE;AAED,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;EAO/E;AAED,wBAAgB,OAAO;;;;;;;;;;;;;;;;;;;;;;EAWtB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;;;;;;;;;EAcpE;AAID,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA+ItD;AAID,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,CAShF;AAID,wBAAsB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAsGtF;AAID,wBAAsB,cAAc,CAClC,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,GAAG,EAAE,MAAM,GAAG,IAAI,GACjB,OAAO,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA0HrG;AAID,wBAAsB,WAAW,CAC/B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,GAAG,CAAC,CAUd;AA0JD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACtF,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAoEpF;AAID,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,GACV,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA0BjC"}
|
package/dist/oauth/server.js
CHANGED
|
@@ -161,9 +161,11 @@ export async function handlePar(config, body, dpopHeader, requestUrl) {
|
|
|
161
161
|
let pdsAuthServer;
|
|
162
162
|
let pdsCodeVerifier;
|
|
163
163
|
let pdsState;
|
|
164
|
+
let pdsEndpoint;
|
|
164
165
|
if (did) {
|
|
165
166
|
const discovery = await discoverAuthServer(did, _plcUrl);
|
|
166
167
|
pdsAuthServer = discovery.authServerEndpoint;
|
|
168
|
+
pdsEndpoint = discovery.pdsEndpoint;
|
|
167
169
|
// Create PKCE for our PAR to the PDS
|
|
168
170
|
pdsCodeVerifier = randomToken();
|
|
169
171
|
const pdsCodeChallenge = base64UrlEncode(await sha256(pdsCodeVerifier));
|
|
@@ -242,6 +244,7 @@ export async function handlePar(config, body, dpopHeader, requestUrl) {
|
|
|
242
244
|
dpopJkt: dpop.jkt,
|
|
243
245
|
pdsRequestUri,
|
|
244
246
|
pdsAuthServer,
|
|
247
|
+
pdsEndpoint,
|
|
245
248
|
pdsCodeVerifier,
|
|
246
249
|
pdsState,
|
|
247
250
|
did,
|
|
@@ -271,6 +274,7 @@ export async function serverLogin(config, handle) {
|
|
|
271
274
|
// Discover PDS auth server
|
|
272
275
|
const discovery = await discoverAuthServer(did, _plcUrl);
|
|
273
276
|
const pdsAuthServer = discovery.authServerEndpoint;
|
|
277
|
+
const pdsEndpoint = discovery.pdsEndpoint;
|
|
274
278
|
// Create PKCE for PAR to PDS
|
|
275
279
|
const pdsCodeVerifier = randomToken();
|
|
276
280
|
const pdsCodeChallenge = base64UrlEncode(await sha256(pdsCodeVerifier));
|
|
@@ -335,6 +339,7 @@ export async function serverLogin(config, handle) {
|
|
|
335
339
|
dpopJkt: serverJkt,
|
|
336
340
|
pdsRequestUri,
|
|
337
341
|
pdsAuthServer,
|
|
342
|
+
pdsEndpoint,
|
|
338
343
|
pdsCodeVerifier,
|
|
339
344
|
pdsState,
|
|
340
345
|
did,
|
|
@@ -424,9 +429,10 @@ export async function handleCallback(config, code, state, iss) {
|
|
|
424
429
|
const did = tokenData.sub;
|
|
425
430
|
if (!did)
|
|
426
431
|
throw new Error('PDS token response missing sub (DID)');
|
|
427
|
-
// Store PDS session server-side
|
|
432
|
+
// Store PDS session server-side — pds_endpoint is the actual data PDS
|
|
433
|
+
// (e.g. leccinum.us-west.host.bsky.network), not the auth server (bsky.social)
|
|
428
434
|
await storeSession(did, {
|
|
429
|
-
pdsEndpoint: request.
|
|
435
|
+
pdsEndpoint: request.pds_endpoint,
|
|
430
436
|
accessToken: tokenData.access_token,
|
|
431
437
|
refreshToken: tokenData.refresh_token,
|
|
432
438
|
dpopJkt: serverJkt,
|
package/dist/pds-proxy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pds-proxy.d.ts","sourceRoot":"","sources":["../src/pds-proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAU9C,qBAAa,UAAW,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAIlB;AAED,qBAAa,sBAAuB,SAAQ,UAAU;;CAIrD;
|
|
1
|
+
{"version":3,"file":"pds-proxy.d.ts","sourceRoot":"","sources":["../src/pds-proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAU9C,qBAAa,UAAW,SAAQ,KAAK;IAE1B,MAAM,EAAE,MAAM;gBAAd,MAAM,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM;CAIlB;AAED,qBAAa,sBAAuB,SAAQ,UAAU;;CAIrD;AAuHD,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EACvB,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC3F,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCzC;AAED,wBAAsB,eAAe,CACnC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EACvB,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBlC;AAED,wBAAsB,YAAY,CAChC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EACvB,KAAK,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1F,OAAO,CAAC;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqCzC;AAED,wBAAsB,aAAa,CACjC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EACvB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAS5B"}
|
package/dist/pds-proxy.js
CHANGED
|
@@ -41,7 +41,10 @@ async function withDpopRetry(oauthConfig, session, doFetch) {
|
|
|
41
41
|
throw new ScopeMissingProxyError();
|
|
42
42
|
}
|
|
43
43
|
// Step 3: handle expired PDS token — refresh and retry
|
|
44
|
-
|
|
44
|
+
// The PDS returns 'InvalidToken' or 'ExpiredToken' (AT Proto PascalCase convention)
|
|
45
|
+
// while the OAuth spec uses 'invalid_token' (RFC 6750 snake_case)
|
|
46
|
+
const err = result.body.error;
|
|
47
|
+
if (err === 'invalid_token' || err === 'InvalidToken' || err === 'ExpiredToken') {
|
|
45
48
|
const refreshed = await refreshPdsSession(oauthConfig, session);
|
|
46
49
|
if (refreshed) {
|
|
47
50
|
accessToken = refreshed.accessToken;
|