@linkforty/core 1.41.2 → 1.42.0
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/README.md +81 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +111 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/config.test.d.ts +2 -0
- package/dist/lib/config.test.d.ts.map +1 -0
- package/dist/lib/config.test.js +86 -0
- package/dist/lib/config.test.js.map +1 -0
- package/dist/lib/database.d.ts +15 -0
- package/dist/lib/database.d.ts.map +1 -1
- package/dist/lib/database.js +36 -2
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/database.test.js +73 -0
- package/dist/lib/database.test.js.map +1 -1
- package/dist/lib/not-found-page.d.ts +106 -0
- package/dist/lib/not-found-page.d.ts.map +1 -0
- package/dist/lib/not-found-page.js +212 -0
- package/dist/lib/not-found-page.js.map +1 -0
- package/dist/lib/not-found-page.test.d.ts +2 -0
- package/dist/lib/not-found-page.test.d.ts.map +1 -0
- package/dist/lib/not-found-page.test.js +151 -0
- package/dist/lib/not-found-page.test.js.map +1 -0
- package/dist/lib/schema-guard.d.ts +46 -0
- package/dist/lib/schema-guard.d.ts.map +1 -0
- package/dist/lib/schema-guard.js +135 -0
- package/dist/lib/schema-guard.js.map +1 -0
- package/dist/lib/schema-guard.test.d.ts +2 -0
- package/dist/lib/schema-guard.test.d.ts.map +1 -0
- package/dist/lib/schema-guard.test.js +83 -0
- package/dist/lib/schema-guard.test.js.map +1 -0
- package/dist/routes/redirect.d.ts +21 -0
- package/dist/routes/redirect.d.ts.map +1 -1
- package/dist/routes/redirect.js +72 -7
- package/dist/routes/redirect.js.map +1 -1
- package/dist/routes/redirect.no-web-destination.test.js +2 -2
- package/dist/routes/redirect.no-web-destination.test.js.map +1 -1
- package/dist/routes/redirect.not-found.test.d.ts +2 -0
- package/dist/routes/redirect.not-found.test.d.ts.map +1 -0
- package/dist/routes/redirect.not-found.test.js +280 -0
- package/dist/routes/redirect.not-found.test.js.map +1 -0
- package/linkforty.config.example.json +11 -0
- package/package.json +3 -2
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type pg from 'pg';
|
|
2
|
+
/**
|
|
3
|
+
* Schema statements that never ask Postgres for a lock they do not need.
|
|
4
|
+
*
|
|
5
|
+
* Postgres acquires a table's lock *before* it evaluates `IF NOT EXISTS`. An
|
|
6
|
+
* `ALTER TABLE … ADD COLUMN IF NOT EXISTS` for a column that has existed for a
|
|
7
|
+
* year still requests ACCESS EXCLUSIVE on the table; `CREATE INDEX IF NOT
|
|
8
|
+
* EXISTS` for an index that exists still requests SHARE. If anything long is
|
|
9
|
+
* reading or writing the table at that moment — a retention job, a large
|
|
10
|
+
* export, an analytics rebuild — the request waits, and Postgres then queues
|
|
11
|
+
* every later request on the table behind the waiting one. A routine start of
|
|
12
|
+
* a second instance becomes a stall of the whole table for as long as the long
|
|
13
|
+
* statement runs; redirects included, since they read `links`.
|
|
14
|
+
*
|
|
15
|
+
* `guardSchemaClient` wraps the initialisation client and answers the
|
|
16
|
+
* idempotent statement shapes from the catalog first: a column that exists, an
|
|
17
|
+
* index that exists, a constraint that is already gone, a NOT NULL that is
|
|
18
|
+
* already set or dropped. Those statements never reach Postgres, so they never
|
|
19
|
+
* ask for a lock. Anything else — a new column, a `CREATE TABLE`, a `DO`
|
|
20
|
+
* block, a parameterised query, a string holding several statements — passes
|
|
21
|
+
* through untouched.
|
|
22
|
+
*/
|
|
23
|
+
/** SQLSTATE for "canceling statement due to lock timeout". */
|
|
24
|
+
export declare const LOCK_NOT_AVAILABLE = "55P03";
|
|
25
|
+
export interface Queryable {
|
|
26
|
+
query: (text: string, params?: any[]) => Promise<pg.QueryResult<any>>;
|
|
27
|
+
}
|
|
28
|
+
export interface SchemaClient extends Queryable {
|
|
29
|
+
release: () => void;
|
|
30
|
+
/** Statements answered from the catalog instead of being sent to Postgres. */
|
|
31
|
+
readonly skipped: string[];
|
|
32
|
+
}
|
|
33
|
+
export declare function isLockTimeout(error: unknown): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Decide whether a statement's effect already exists. Returns the reason to
|
|
36
|
+
* skip it, or null to send it to Postgres.
|
|
37
|
+
*/
|
|
38
|
+
export declare function alreadyApplied(client: Queryable, text: string): Promise<string | null>;
|
|
39
|
+
/**
|
|
40
|
+
* A client whose idempotent schema statements are answered from the catalog
|
|
41
|
+
* when their effect already exists, so they never ask Postgres for a lock.
|
|
42
|
+
*/
|
|
43
|
+
export declare function guardSchemaClient(client: Queryable & {
|
|
44
|
+
release: () => void;
|
|
45
|
+
}): SchemaClient;
|
|
46
|
+
//# sourceMappingURL=schema-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-guard.d.ts","sourceRoot":"","sources":["../../src/lib/schema-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAwDD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuC5F;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG;IAAE,OAAO,EAAE,MAAM,IAAI,CAAA;CAAE,GAAG,YAAY,CAgB3F"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema statements that never ask Postgres for a lock they do not need.
|
|
3
|
+
*
|
|
4
|
+
* Postgres acquires a table's lock *before* it evaluates `IF NOT EXISTS`. An
|
|
5
|
+
* `ALTER TABLE … ADD COLUMN IF NOT EXISTS` for a column that has existed for a
|
|
6
|
+
* year still requests ACCESS EXCLUSIVE on the table; `CREATE INDEX IF NOT
|
|
7
|
+
* EXISTS` for an index that exists still requests SHARE. If anything long is
|
|
8
|
+
* reading or writing the table at that moment — a retention job, a large
|
|
9
|
+
* export, an analytics rebuild — the request waits, and Postgres then queues
|
|
10
|
+
* every later request on the table behind the waiting one. A routine start of
|
|
11
|
+
* a second instance becomes a stall of the whole table for as long as the long
|
|
12
|
+
* statement runs; redirects included, since they read `links`.
|
|
13
|
+
*
|
|
14
|
+
* `guardSchemaClient` wraps the initialisation client and answers the
|
|
15
|
+
* idempotent statement shapes from the catalog first: a column that exists, an
|
|
16
|
+
* index that exists, a constraint that is already gone, a NOT NULL that is
|
|
17
|
+
* already set or dropped. Those statements never reach Postgres, so they never
|
|
18
|
+
* ask for a lock. Anything else — a new column, a `CREATE TABLE`, a `DO`
|
|
19
|
+
* block, a parameterised query, a string holding several statements — passes
|
|
20
|
+
* through untouched.
|
|
21
|
+
*/
|
|
22
|
+
/** SQLSTATE for "canceling statement due to lock timeout". */
|
|
23
|
+
export const LOCK_NOT_AVAILABLE = '55P03';
|
|
24
|
+
export function isLockTimeout(error) {
|
|
25
|
+
return typeof error === 'object' && error !== null && error.code === LOCK_NOT_AVAILABLE;
|
|
26
|
+
}
|
|
27
|
+
// One statement only: a trailing semicolon is fine, a second statement is not
|
|
28
|
+
// ours to interpret, so it passes through.
|
|
29
|
+
function single(text) {
|
|
30
|
+
const t = text.trim().replace(/;\s*$/, '');
|
|
31
|
+
return t.includes(';') ? null : t;
|
|
32
|
+
}
|
|
33
|
+
const ident = (raw) => raw.replace(/^"|"$/g, '');
|
|
34
|
+
/** `schema.table` → the table part; the catalog lookups scope to the search path. */
|
|
35
|
+
const tableOf = (raw) => ident(raw.split('.').pop() ?? raw);
|
|
36
|
+
const ALTER_TABLE = /^ALTER\s+TABLE\s+(?:IF\s+EXISTS\s+)?("?[\w.]+"?)\s+([\s\S]+)$/i;
|
|
37
|
+
const ADD_COLUMN_ACTION = /^\s*ADD\s+COLUMN\s+IF\s+NOT\s+EXISTS\s+("?\w+"?)\b/i;
|
|
38
|
+
// Actions of one ALTER TABLE are split only at a comma that starts another
|
|
39
|
+
// ADD COLUMN IF NOT EXISTS, so commas inside a type (NUMERIC(18,4)), a default
|
|
40
|
+
// or a REFERENCES list stay put.
|
|
41
|
+
const ACTION_SEPARATOR = /,(?=\s*ADD\s+COLUMN\s+IF\s+NOT\s+EXISTS\b)/i;
|
|
42
|
+
const CREATE_INDEX = /^CREATE\s+(?:UNIQUE\s+)?INDEX\s+(?:CONCURRENTLY\s+)?IF\s+NOT\s+EXISTS\s+("?\w+"?)\s+ON\b/i;
|
|
43
|
+
const DROP_CONSTRAINT = /^ALTER\s+TABLE\s+(?:IF\s+EXISTS\s+)?("?[\w.]+"?)\s+DROP\s+CONSTRAINT\s+IF\s+EXISTS\s+("?\w+"?)\s*$/i;
|
|
44
|
+
const SET_NOT_NULL = /^ALTER\s+TABLE\s+(?:IF\s+EXISTS\s+)?("?[\w.]+"?)\s+ALTER\s+COLUMN\s+("?\w+"?)\s+SET\s+NOT\s+NULL\s*$/i;
|
|
45
|
+
const DROP_NOT_NULL = /^ALTER\s+TABLE\s+(?:IF\s+EXISTS\s+)?("?[\w.]+"?)\s+ALTER\s+COLUMN\s+("?\w+"?)\s+DROP\s+NOT\s+NULL\s*$/i;
|
|
46
|
+
/** True when a comma remains once quoted strings and parenthesised groups are removed: a second action hides in there. */
|
|
47
|
+
function hasTopLevelComma(action) {
|
|
48
|
+
let s = action.replace(/'[^']*'/g, '');
|
|
49
|
+
for (let prev = ''; prev !== s;) {
|
|
50
|
+
prev = s;
|
|
51
|
+
s = s.replace(/\([^()]*\)/g, '');
|
|
52
|
+
}
|
|
53
|
+
return s.includes(',');
|
|
54
|
+
}
|
|
55
|
+
/** The column names when every action of the ALTER is ADD COLUMN IF NOT EXISTS; null otherwise. */
|
|
56
|
+
function addColumnNames(t) {
|
|
57
|
+
const m = t.match(ALTER_TABLE);
|
|
58
|
+
if (!m)
|
|
59
|
+
return null;
|
|
60
|
+
const columns = [];
|
|
61
|
+
for (const action of m[2].split(ACTION_SEPARATOR)) {
|
|
62
|
+
const a = action.match(ADD_COLUMN_ACTION);
|
|
63
|
+
if (!a || hasTopLevelComma(action))
|
|
64
|
+
return null;
|
|
65
|
+
columns.push(ident(a[1]));
|
|
66
|
+
}
|
|
67
|
+
return columns.length > 0 ? { table: tableOf(m[1]), columns } : null;
|
|
68
|
+
}
|
|
69
|
+
async function columnNullable(client, table, column) {
|
|
70
|
+
const r = await client.query(`SELECT is_nullable FROM information_schema.columns
|
|
71
|
+
WHERE table_schema = ANY(current_schemas(false)) AND table_name = $1 AND column_name = $2`, [table, column]);
|
|
72
|
+
return r.rows[0]?.is_nullable ?? null;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Decide whether a statement's effect already exists. Returns the reason to
|
|
76
|
+
* skip it, or null to send it to Postgres.
|
|
77
|
+
*/
|
|
78
|
+
export async function alreadyApplied(client, text) {
|
|
79
|
+
const t = single(text);
|
|
80
|
+
if (!t)
|
|
81
|
+
return null;
|
|
82
|
+
const add = addColumnNames(t);
|
|
83
|
+
if (add) {
|
|
84
|
+
// Skip only when every column exists; Postgres handles a mix itself.
|
|
85
|
+
for (const column of add.columns) {
|
|
86
|
+
if ((await columnNullable(client, add.table, column)) === null)
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
return `column${add.columns.length > 1 ? 's' : ''} ${add.table}.${add.columns.join(', ')} exist${add.columns.length > 1 ? '' : 's'}`;
|
|
90
|
+
}
|
|
91
|
+
let m = t.match(CREATE_INDEX);
|
|
92
|
+
if (m) {
|
|
93
|
+
const r = await client.query(`SELECT 1 FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
94
|
+
WHERE c.relkind = 'i' AND c.relname = $1 AND n.nspname = ANY(current_schemas(false))`, [ident(m[1])]);
|
|
95
|
+
return r.rows.length > 0 ? `index ${ident(m[1])} exists` : null;
|
|
96
|
+
}
|
|
97
|
+
m = t.match(DROP_CONSTRAINT);
|
|
98
|
+
if (m) {
|
|
99
|
+
const r = await client.query(`SELECT 1 FROM pg_constraint con JOIN pg_class c ON c.oid = con.conrelid
|
|
100
|
+
WHERE con.conname = $1 AND c.relname = $2`, [ident(m[2]), tableOf(m[1])]);
|
|
101
|
+
return r.rows.length === 0 ? `constraint ${ident(m[2])} already absent` : null;
|
|
102
|
+
}
|
|
103
|
+
m = t.match(SET_NOT_NULL);
|
|
104
|
+
if (m) {
|
|
105
|
+
return (await columnNullable(client, tableOf(m[1]), ident(m[2]))) === 'NO' ? `${tableOf(m[1])}.${ident(m[2])} already NOT NULL` : null;
|
|
106
|
+
}
|
|
107
|
+
m = t.match(DROP_NOT_NULL);
|
|
108
|
+
if (m) {
|
|
109
|
+
return (await columnNullable(client, tableOf(m[1]), ident(m[2]))) === 'YES' ? `${tableOf(m[1])}.${ident(m[2])} already nullable` : null;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const SKIPPED = { rows: [], rowCount: 0, command: 'SKIP', oid: 0, fields: [] };
|
|
114
|
+
/**
|
|
115
|
+
* A client whose idempotent schema statements are answered from the catalog
|
|
116
|
+
* when their effect already exists, so they never ask Postgres for a lock.
|
|
117
|
+
*/
|
|
118
|
+
export function guardSchemaClient(client) {
|
|
119
|
+
const skipped = [];
|
|
120
|
+
return {
|
|
121
|
+
skipped,
|
|
122
|
+
release: () => client.release(),
|
|
123
|
+
async query(text, params) {
|
|
124
|
+
if (!params || params.length === 0) {
|
|
125
|
+
const why = await alreadyApplied(client, text);
|
|
126
|
+
if (why) {
|
|
127
|
+
skipped.push(why);
|
|
128
|
+
return SKIPPED;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return client.query(text, params);
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=schema-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-guard.js","sourceRoot":"","sources":["../../src/lib/schema-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-guard.test.d.ts","sourceRoot":"","sources":["../../src/lib/schema-guard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { LOCK_NOT_AVAILABLE, alreadyApplied, guardSchemaClient, isLockTimeout } from './schema-guard.js';
|
|
3
|
+
function fakeClient(catalog) {
|
|
4
|
+
const query = vi.fn(async (text, params) => {
|
|
5
|
+
if (text.includes('information_schema.columns')) {
|
|
6
|
+
const hit = (catalog.columns ?? []).find(([t, c]) => t === params[0] && c === params[1]);
|
|
7
|
+
return { rows: hit ? [{ is_nullable: hit[2] }] : [], rowCount: hit ? 1 : 0 };
|
|
8
|
+
}
|
|
9
|
+
if (text.includes('pg_class c JOIN pg_namespace')) {
|
|
10
|
+
return { rows: (catalog.indexes ?? []).includes(params[0]) ? [{}] : [], rowCount: 0 };
|
|
11
|
+
}
|
|
12
|
+
if (text.includes('pg_constraint')) {
|
|
13
|
+
const hit = (catalog.constraints ?? []).some(([n, t]) => n === params[0] && t === params[1]);
|
|
14
|
+
return { rows: hit ? [{}] : [], rowCount: 0 };
|
|
15
|
+
}
|
|
16
|
+
return { rows: [], rowCount: 0, command: 'SENT' };
|
|
17
|
+
});
|
|
18
|
+
return { query, release: vi.fn() };
|
|
19
|
+
}
|
|
20
|
+
describe('alreadyApplied', () => {
|
|
21
|
+
it('answers an existing column, index, absent constraint and settled NOT NULL from the catalog', async () => {
|
|
22
|
+
const c = fakeClient({
|
|
23
|
+
columns: [['links', 'append_click_id', 'YES'], ['links', 'warn_at', 'YES'], ['users', 'password_hash', 'YES']],
|
|
24
|
+
indexes: ['idx_clicks_link_id'],
|
|
25
|
+
constraints: [['present_key', 'events']],
|
|
26
|
+
});
|
|
27
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS append_click_id BOOLEAN DEFAULT false')).toMatch(/exists/);
|
|
28
|
+
expect(await alreadyApplied(c, ' ALTER TABLE "links" ADD COLUMN IF NOT EXISTS "append_click_id" BOOLEAN;\n')).toMatch(/exists/);
|
|
29
|
+
expect(await alreadyApplied(c, 'ALTER TABLE public.links ADD COLUMN IF NOT EXISTS warn_at TIMESTAMPTZ')).toMatch(/exists/);
|
|
30
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links\n ADD COLUMN IF NOT EXISTS append_click_id BOOLEAN,\n ADD COLUMN IF NOT EXISTS warn_at TIMESTAMPTZ')).toBe('columns links.append_click_id, warn_at exist');
|
|
31
|
+
expect(await alreadyApplied(c, 'CREATE INDEX IF NOT EXISTS idx_clicks_link_id ON click_events(link_id)')).toMatch(/exists/);
|
|
32
|
+
expect(await alreadyApplied(c, 'CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS idx_clicks_link_id ON click_events(link_id)')).toMatch(/exists/);
|
|
33
|
+
expect(await alreadyApplied(c, 'ALTER TABLE events DROP CONSTRAINT IF EXISTS gone_key')).toMatch(/absent/);
|
|
34
|
+
expect(await alreadyApplied(c, 'ALTER TABLE users ALTER COLUMN password_hash DROP NOT NULL')).toMatch(/already nullable/);
|
|
35
|
+
});
|
|
36
|
+
it('sends statements whose effect is missing, and anything it does not understand', async () => {
|
|
37
|
+
const c = fakeClient({ columns: [['users', 'password_hash', 'NO'], ['links', 'warn_at', 'YES']], constraints: [['present_key', 'events']] });
|
|
38
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS brand_new TEXT')).toBeNull();
|
|
39
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS warn_at TIMESTAMPTZ, ADD COLUMN IF NOT EXISTS brand_new INTEGER NOT NULL DEFAULT 0')).toBeNull();
|
|
40
|
+
expect(await alreadyApplied(c, 'CREATE INDEX IF NOT EXISTS idx_missing ON links(id)')).toBeNull();
|
|
41
|
+
expect(await alreadyApplied(c, 'ALTER TABLE events DROP CONSTRAINT IF EXISTS present_key')).toBeNull();
|
|
42
|
+
expect(await alreadyApplied(c, 'ALTER TABLE users ALTER COLUMN password_hash DROP NOT NULL')).toBeNull();
|
|
43
|
+
expect(await alreadyApplied(c, 'ALTER TABLE users ALTER COLUMN password_hash SET NOT NULL')).toMatch(/already NOT NULL/);
|
|
44
|
+
// A comma inside a type or default does not split the action.
|
|
45
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS warn_at NUMERIC(18,4) DEFAULT 0')).toMatch(/exist/);
|
|
46
|
+
// Shapes that are not idempotent are never guessed at.
|
|
47
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN brand_new TEXT')).toBeNull();
|
|
48
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS warn_at TIMESTAMPTZ, ALTER COLUMN warn_at SET DEFAULT NULL')).toBeNull();
|
|
49
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ALTER COLUMN x SET DEFAULT 1')).toBeNull();
|
|
50
|
+
expect(await alreadyApplied(c, 'CREATE TABLE IF NOT EXISTS t (id int)')).toBeNull();
|
|
51
|
+
expect(await alreadyApplied(c, "DO $$ BEGIN ALTER TABLE links ADD COLUMN IF NOT EXISTS warn_at TEXT; END $$")).toBeNull();
|
|
52
|
+
expect(await alreadyApplied(c, 'ALTER TABLE links ADD COLUMN IF NOT EXISTS a TEXT; ALTER TABLE links ADD COLUMN IF NOT EXISTS b TEXT')).toBeNull();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('guardSchemaClient', () => {
|
|
56
|
+
it('skips what exists, passes the rest through, records why, and releases the real client', async () => {
|
|
57
|
+
const raw = fakeClient({ columns: [['links', 'warn_at', 'YES']] });
|
|
58
|
+
const client = guardSchemaClient(raw);
|
|
59
|
+
expect((await client.query('ALTER TABLE links ADD COLUMN IF NOT EXISTS warn_at TIMESTAMPTZ')).command).toBe('SKIP');
|
|
60
|
+
expect((await client.query('ALTER TABLE links ADD COLUMN IF NOT EXISTS brand_new TEXT')).command).toBe('SENT');
|
|
61
|
+
await client.query('SELECT pg_advisory_lock($1)', [1]);
|
|
62
|
+
expect(client.skipped).toEqual(['column links.warn_at exists']);
|
|
63
|
+
expect(raw.query.mock.calls.map((c) => String(c[0]).slice(0, 30))).toEqual([
|
|
64
|
+
'SELECT is_nullable FROM inform',
|
|
65
|
+
'SELECT is_nullable FROM inform',
|
|
66
|
+
'ALTER TABLE links ADD COLUMN I',
|
|
67
|
+
'SELECT pg_advisory_lock($1)',
|
|
68
|
+
]);
|
|
69
|
+
client.release();
|
|
70
|
+
expect(raw.release).toHaveBeenCalledTimes(1);
|
|
71
|
+
});
|
|
72
|
+
it('never inspects parameterised statements', async () => {
|
|
73
|
+
const raw = fakeClient({ columns: [['links', 'x', 'YES']] });
|
|
74
|
+
await guardSchemaClient(raw).query('ALTER TABLE links ADD COLUMN IF NOT EXISTS x TEXT', [1]);
|
|
75
|
+
expect(raw.query).toHaveBeenCalledTimes(1);
|
|
76
|
+
});
|
|
77
|
+
it('recognises a lock timeout by SQLSTATE', () => {
|
|
78
|
+
expect(isLockTimeout(Object.assign(new Error('x'), { code: LOCK_NOT_AVAILABLE }))).toBe(true);
|
|
79
|
+
expect(isLockTimeout(new Error('x'))).toBe(false);
|
|
80
|
+
expect(isLockTimeout(null)).toBe(false);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=schema-guard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-guard.test.js","sourceRoot":"","sources":["../../src/lib/schema-guard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FastifyInstance, FastifyRequest } from 'fastify';
|
|
2
2
|
import { type LaunchpadContent, type LaunchpadContentContext, type LaunchpadSettings } from '../lib/launchpad.js';
|
|
3
|
+
import { type NotFoundContext, type NotFoundResolution, type NotFoundSettings } from '../lib/not-found-page.js';
|
|
3
4
|
/**
|
|
4
5
|
* Detect iOS in-app browsers where Universal Links don't fire.
|
|
5
6
|
* These browsers use WKWebView which bypasses the Universal Links mechanism.
|
|
@@ -86,6 +87,26 @@ export interface RedirectRouteOptions {
|
|
|
86
87
|
* claim its URLs either. A hook that throws is logged and treated as false.
|
|
87
88
|
*/
|
|
88
89
|
isWebLinkRequest?: (request: FastifyRequest) => Promise<boolean> | boolean;
|
|
90
|
+
/**
|
|
91
|
+
* The instance's not-found page, or a URL to send browsers to instead, used
|
|
92
|
+
* when the organization has no `settings.notFound` of its own
|
|
93
|
+
* (lib/not-found-page.ts). createServer() fills it from the `notFound`
|
|
94
|
+
* section of linkforty.config.json.
|
|
95
|
+
*/
|
|
96
|
+
notFoundDefaults?: NotFoundSettings;
|
|
97
|
+
/**
|
|
98
|
+
* Decide the not-found response in code, ahead of the organization's settings
|
|
99
|
+
* and `notFoundDefaults`: page content, a URL to redirect to, or null to fall
|
|
100
|
+
* through to them. Called only for requests that accept HTML; other clients
|
|
101
|
+
* keep the JSON 404. Not called for a link withdrawn for abuse, which keeps its
|
|
102
|
+
* own notice.
|
|
103
|
+
*
|
|
104
|
+
* `context.reason` is for the host's own decisions. Whatever the host returns,
|
|
105
|
+
* return the same thing for every reason it treats alike: an expired link must
|
|
106
|
+
* not be told apart from a code that never existed. A hook that throws is
|
|
107
|
+
* logged and treated as null.
|
|
108
|
+
*/
|
|
109
|
+
notFound?: (request: FastifyRequest, context: NotFoundContext) => Promise<NotFoundResolution | null> | NotFoundResolution | null;
|
|
89
110
|
}
|
|
90
111
|
export declare function redirectRoutes(fastify: FastifyInstance, options?: RedirectRouteOptions): Promise<void>;
|
|
91
112
|
//# sourceMappingURL=redirect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiB1D,OAAO,EASL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAiB1D,OAAO,EASL,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAUL,KAAK,eAAe,EAEpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAKlC;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAa5D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAiBhE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,KAAK,GAAG,SAAS,EACzB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,UAAU,EAAE,MAAM,GAAG,IAAI,EACzB,cAAc,EAAE,MAAM,GAAG,IAAI,GAC5B;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAexC;AAKD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMlD;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAiB5E;AAmID,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE;QACV;;;;WAIG;QACH,cAAc,CAAC,EAAE,CACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,uBAAuB,KAC7B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,gBAAgB,GAAG,IAAI,CAAC;QAChE;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IAC3E;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,CACT,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,eAAe,KACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,kBAAkB,GAAG,IAAI,CAAC;CACrE;AAED,wBAAsB,cAAc,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,GAAE,oBAAyB,iBAi3BnC"}
|
package/dist/routes/redirect.js
CHANGED
|
@@ -8,6 +8,7 @@ import { emitClickEvent } from '../lib/event-emitter.js';
|
|
|
8
8
|
import { classifyBot, edgeBotSignal } from '../lib/bot-detection.js';
|
|
9
9
|
import { evaluateLinkSafetyDecision, blockCauseIsAbuse, generateWarningLinkHTML, generateBlockedLinkHTML, createOwnerSuspensionSelect, escapeHtml, safeSchemeHref, } from '../lib/link-safety.js';
|
|
10
10
|
import { createLaunchpadNonce, defaultLaunchpadContent, launchpadContentSecurityPolicy, readLaunchpadLinkMode, readLaunchpadSettings, renderLaunchpadPage, shouldServeLaunchpadOnDesktop, shouldServeLaunchpadOnMobile, } from '../lib/launchpad.js';
|
|
11
|
+
import { NOT_FOUND_JSON, createOrganizationNotFoundSettingsLookup, notFoundContentSecurityPolicy, readNotFoundSettings, readOrganizationNotFoundSettings, renderNotFoundPage, resolveNotFoundSettings, safeNotFoundRedirect, wantsHtml, } from '../lib/not-found-page.js';
|
|
11
12
|
/** Longest query string the Launchpad page carries into its QR code and og:url. */
|
|
12
13
|
const MAX_PAGE_URL_SEARCH = 512;
|
|
13
14
|
/**
|
|
@@ -299,6 +300,68 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
299
300
|
fastify.log.warn({ err: error }, 'Bare code ownership check failed');
|
|
300
301
|
}
|
|
301
302
|
}
|
|
303
|
+
/**
|
|
304
|
+
* Answer a link that can't be served. Browsers get the not-found page (or the
|
|
305
|
+
* host's redirect); everything else gets the JSON body it always has. Records
|
|
306
|
+
* nothing: whether a click was already written is up to the caller.
|
|
307
|
+
*/
|
|
308
|
+
const notFoundDefaults = readNotFoundSettings(options.notFoundDefaults);
|
|
309
|
+
const lookupOrganizationNotFoundSettings = createOrganizationNotFoundSettingsLookup({
|
|
310
|
+
query: (sql, params) => db.query(sql, params),
|
|
311
|
+
onError: (err) => fastify.log.warn({ err }, 'Reading not-found settings failed; using the instance page'),
|
|
312
|
+
});
|
|
313
|
+
/**
|
|
314
|
+
* The settings that speak for this not-found: the host's organization, or for
|
|
315
|
+
* a live link with nothing for this visitor, the link's own organization;
|
|
316
|
+
* then the instance's. See lib/not-found-page.ts.
|
|
317
|
+
*/
|
|
318
|
+
async function notFoundSettingsFor(reason, link, scope) {
|
|
319
|
+
const linkSpeaks = reason === 'not_targeted' || reason === 'no_destination';
|
|
320
|
+
const organizationId = scope ?? (linkSpeaks ? link?.organization_id ?? null : null);
|
|
321
|
+
if (organizationId) {
|
|
322
|
+
const own = link && link.organization_id === organizationId
|
|
323
|
+
? readOrganizationNotFoundSettings(link.org_settings)
|
|
324
|
+
: await lookupOrganizationNotFoundSettings(organizationId);
|
|
325
|
+
if (own)
|
|
326
|
+
return own;
|
|
327
|
+
}
|
|
328
|
+
return notFoundDefaults;
|
|
329
|
+
}
|
|
330
|
+
async function sendNotFound(request, reply, reason, link, scope) {
|
|
331
|
+
if (!wantsHtml(request.headers.accept)) {
|
|
332
|
+
return reply
|
|
333
|
+
.status(404)
|
|
334
|
+
.send(reason === 'no_destination' ? NOT_FOUND_JSON.no_destination : NOT_FOUND_JSON.default);
|
|
335
|
+
}
|
|
336
|
+
let resolution = null;
|
|
337
|
+
if (options.notFound) {
|
|
338
|
+
try {
|
|
339
|
+
resolution = (await options.notFound(request, { reason, link, scope })) ?? null;
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
fastify.log.error({ err, reason }, 'notFound hook threw; using the configured page');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
if (!resolution) {
|
|
346
|
+
const settings = await notFoundSettingsFor(reason, link, scope);
|
|
347
|
+
if (settings)
|
|
348
|
+
resolution = resolveNotFoundSettings(settings);
|
|
349
|
+
}
|
|
350
|
+
if (resolution?.kind === 'redirect') {
|
|
351
|
+
const target = safeNotFoundRedirect(resolution.url);
|
|
352
|
+
if (target) {
|
|
353
|
+
return reply.header('Cache-Control', 'no-store').redirect(302, target);
|
|
354
|
+
}
|
|
355
|
+
fastify.log.warn({ reason }, 'Not-found redirect is not http(s); using the default page');
|
|
356
|
+
}
|
|
357
|
+
return reply
|
|
358
|
+
.status(404)
|
|
359
|
+
.header('X-Robots-Tag', 'noindex, nofollow')
|
|
360
|
+
.header('Cache-Control', 'no-store')
|
|
361
|
+
.header('Content-Security-Policy', notFoundContentSecurityPolicy())
|
|
362
|
+
.type('text/html')
|
|
363
|
+
.send(renderNotFoundPage(resolution?.kind === 'page' ? resolution.content : {}));
|
|
364
|
+
}
|
|
302
365
|
// Helper function to handle the actual redirect logic
|
|
303
366
|
async function handleRedirect(request, reply, shortCode, templateSlug) {
|
|
304
367
|
let linkData = null;
|
|
@@ -360,7 +423,7 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
360
423
|
if (result.rows.length === 0) {
|
|
361
424
|
if (scope)
|
|
362
425
|
await logOtherOrganizationCode(shortCode, scope);
|
|
363
|
-
return
|
|
426
|
+
return sendNotFound(request, reply, 'unknown', null, hostScope);
|
|
364
427
|
}
|
|
365
428
|
linkData = JSON.stringify(result.rows[0]);
|
|
366
429
|
// Cache for 5 minutes if Redis is available
|
|
@@ -378,7 +441,9 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
378
441
|
// URL form names them. Checked after the cache read, which is shared by hosts.
|
|
379
442
|
if (hostScope && link.organization_id !== hostScope) {
|
|
380
443
|
logOtherOrganizationLink(shortCode, hostScope);
|
|
381
|
-
|
|
444
|
+
// Indistinguishable from a code that doesn't exist, and the row is not
|
|
445
|
+
// this host's to hand to the hook.
|
|
446
|
+
return sendNotFound(request, reply, 'unknown', null, hostScope);
|
|
382
447
|
}
|
|
383
448
|
// Safety gate, applied after the cache read so it covers cached rows too.
|
|
384
449
|
//
|
|
@@ -417,7 +482,7 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
417
482
|
.type('text/html')
|
|
418
483
|
.send(generateBlockedLinkHTML());
|
|
419
484
|
}
|
|
420
|
-
return
|
|
485
|
+
return sendNotFound(request, reply, 'disabled', link, hostScope);
|
|
421
486
|
}
|
|
422
487
|
if (safety.outcome === 'warn') {
|
|
423
488
|
// No click is recorded here. A warning view is not a click on the link, and
|
|
@@ -464,7 +529,7 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
464
529
|
}
|
|
465
530
|
// If targeting rules exist but user doesn't match, return 404
|
|
466
531
|
if (!isTargeted) {
|
|
467
|
-
return
|
|
532
|
+
return sendNotFound(request, reply, 'not_targeted', link, hostScope);
|
|
468
533
|
}
|
|
469
534
|
}
|
|
470
535
|
// Asked once per click: the async click record and the response below
|
|
@@ -900,8 +965,8 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
900
965
|
* No destination at any level of the chain.
|
|
901
966
|
*
|
|
902
967
|
* On desktop this is a real person who clicked a real link, so serve a page
|
|
903
|
-
* rather than a JSON error body. Mobile
|
|
904
|
-
* already offer a store URL to a device that could install the app, so
|
|
968
|
+
* rather than a JSON error body. Mobile gets the not-found page: the branches
|
|
969
|
+
* above already offer a store URL to a device that could install the app, so
|
|
905
970
|
* reaching here means the link has nothing at all.
|
|
906
971
|
*
|
|
907
972
|
* Unlike the warning page earlier in this handler, this does NOT suppress
|
|
@@ -922,7 +987,7 @@ export async function redirectRoutes(fastify, options = {}) {
|
|
|
922
987
|
androidUrl,
|
|
923
988
|
}));
|
|
924
989
|
}
|
|
925
|
-
return
|
|
990
|
+
return sendNotFound(request, reply, 'no_destination', link, hostScope);
|
|
926
991
|
}
|
|
927
992
|
// Build final URL with parameters
|
|
928
993
|
let finalUrl = redirectUrl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"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"}
|
|
@@ -149,8 +149,8 @@ describe('no web destination', () => {
|
|
|
149
149
|
expect(res.statusCode).toBe(302);
|
|
150
150
|
expect(res.headers.location).toBe('https://from-template.example/');
|
|
151
151
|
});
|
|
152
|
-
/** Mobile already gets a store URL from the branches above; reaching here means nothing exists. */
|
|
153
|
-
it('
|
|
152
|
+
/** Mobile already gets a store URL from the branches above; reaching here means nothing exists. A browser gets the not-found page (redirect.not-found.test.ts). */
|
|
153
|
+
it('keeps the JSON 404 for a mobile client that does not ask for HTML', async () => {
|
|
154
154
|
mockDb(linkRow());
|
|
155
155
|
const res = await get(app, IPHONE_UA);
|
|
156
156
|
expect(res.statusCode).toBe(404);
|