dkimkit 0.0.0-stage → 0.7.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.
Files changed (132) hide show
  1. package/README.md +161 -2
  2. package/dist/src/cli.d.ts +2 -0
  3. package/dist/src/cli.js +398 -0
  4. package/dist/src/cli.js.map +1 -0
  5. package/dist/src/dns-host.d.ts +10 -0
  6. package/dist/src/dns-host.js +31 -0
  7. package/dist/src/dns-host.js.map +1 -0
  8. package/dist/src/errors.d.ts +17 -0
  9. package/dist/src/errors.js +51 -0
  10. package/dist/src/errors.js.map +1 -0
  11. package/dist/src/hosted/api.d.ts +107 -0
  12. package/dist/src/hosted/api.js +919 -0
  13. package/dist/src/hosted/api.js.map +1 -0
  14. package/dist/src/hosted/auth.d.ts +80 -0
  15. package/dist/src/hosted/auth.js +147 -0
  16. package/dist/src/hosted/auth.js.map +1 -0
  17. package/dist/src/hosted/billing-dodo.d.ts +58 -0
  18. package/dist/src/hosted/billing-dodo.js +139 -0
  19. package/dist/src/hosted/billing-dodo.js.map +1 -0
  20. package/dist/src/hosted/billing-stripe.d.ts +82 -0
  21. package/dist/src/hosted/billing-stripe.js +205 -0
  22. package/dist/src/hosted/billing-stripe.js.map +1 -0
  23. package/dist/src/hosted/billing.d.ts +114 -0
  24. package/dist/src/hosted/billing.js +173 -0
  25. package/dist/src/hosted/billing.js.map +1 -0
  26. package/dist/src/hosted/bulk.d.ts +47 -0
  27. package/dist/src/hosted/bulk.js +66 -0
  28. package/dist/src/hosted/bulk.js.map +1 -0
  29. package/dist/src/hosted/cli.d.ts +2 -0
  30. package/dist/src/hosted/cli.js +318 -0
  31. package/dist/src/hosted/cli.js.map +1 -0
  32. package/dist/src/hosted/crypto.d.ts +22 -0
  33. package/dist/src/hosted/crypto.js +55 -0
  34. package/dist/src/hosted/crypto.js.map +1 -0
  35. package/dist/src/hosted/index.d.ts +7 -0
  36. package/dist/src/hosted/index.js +11 -0
  37. package/dist/src/hosted/index.js.map +1 -0
  38. package/dist/src/hosted/markdown.d.ts +16 -0
  39. package/dist/src/hosted/markdown.js +168 -0
  40. package/dist/src/hosted/markdown.js.map +1 -0
  41. package/dist/src/hosted/net.d.ts +9 -0
  42. package/dist/src/hosted/net.js +60 -0
  43. package/dist/src/hosted/net.js.map +1 -0
  44. package/dist/src/hosted/postgres-store.d.ts +62 -0
  45. package/dist/src/hosted/postgres-store.js +387 -0
  46. package/dist/src/hosted/postgres-store.js.map +1 -0
  47. package/dist/src/hosted/serialize.d.ts +144 -0
  48. package/dist/src/hosted/serialize.js +126 -0
  49. package/dist/src/hosted/serialize.js.map +1 -0
  50. package/dist/src/hosted/service.d.ts +170 -0
  51. package/dist/src/hosted/service.js +603 -0
  52. package/dist/src/hosted/service.js.map +1 -0
  53. package/dist/src/hosted/site.d.ts +84 -0
  54. package/dist/src/hosted/site.js +653 -0
  55. package/dist/src/hosted/site.js.map +1 -0
  56. package/dist/src/hosted/sqlite-store.d.ts +45 -0
  57. package/dist/src/hosted/sqlite-store.js +351 -0
  58. package/dist/src/hosted/sqlite-store.js.map +1 -0
  59. package/dist/src/hosted/store.d.ts +257 -0
  60. package/dist/src/hosted/store.js +181 -0
  61. package/dist/src/hosted/store.js.map +1 -0
  62. package/dist/src/hosted/widget.d.ts +46 -0
  63. package/dist/src/hosted/widget.js +130 -0
  64. package/dist/src/hosted/widget.js.map +1 -0
  65. package/dist/src/hosted/worker.d.ts +45 -0
  66. package/dist/src/hosted/worker.js +142 -0
  67. package/dist/src/hosted/worker.js.map +1 -0
  68. package/dist/src/http.d.ts +14 -0
  69. package/dist/src/http.js +54 -0
  70. package/dist/src/http.js.map +1 -0
  71. package/dist/src/index.d.ts +19 -0
  72. package/dist/src/index.js +19 -0
  73. package/dist/src/index.js.map +1 -0
  74. package/dist/src/orchestrator.d.ts +70 -0
  75. package/dist/src/orchestrator.js +69 -0
  76. package/dist/src/orchestrator.js.map +1 -0
  77. package/dist/src/propagation.d.ts +30 -0
  78. package/dist/src/propagation.js +76 -0
  79. package/dist/src/propagation.js.map +1 -0
  80. package/dist/src/providers/dns/aws.d.ts +28 -0
  81. package/dist/src/providers/dns/aws.js +103 -0
  82. package/dist/src/providers/dns/aws.js.map +1 -0
  83. package/dist/src/providers/dns/cloudflare.d.ts +26 -0
  84. package/dist/src/providers/dns/cloudflare.js +97 -0
  85. package/dist/src/providers/dns/cloudflare.js.map +1 -0
  86. package/dist/src/providers/dns/manual.d.ts +12 -0
  87. package/dist/src/providers/dns/manual.js +18 -0
  88. package/dist/src/providers/dns/manual.js.map +1 -0
  89. package/dist/src/providers/dns/route53.d.ts +34 -0
  90. package/dist/src/providers/dns/route53.js +176 -0
  91. package/dist/src/providers/dns/route53.js.map +1 -0
  92. package/dist/src/providers/email/factory.d.ts +29 -0
  93. package/dist/src/providers/email/factory.js +67 -0
  94. package/dist/src/providers/email/factory.js.map +1 -0
  95. package/dist/src/providers/email/mailgun.d.ts +36 -0
  96. package/dist/src/providers/email/mailgun.js +141 -0
  97. package/dist/src/providers/email/mailgun.js.map +1 -0
  98. package/dist/src/providers/email/postmark.d.ts +37 -0
  99. package/dist/src/providers/email/postmark.js +121 -0
  100. package/dist/src/providers/email/postmark.js.map +1 -0
  101. package/dist/src/providers/email/sendgrid.d.ts +31 -0
  102. package/dist/src/providers/email/sendgrid.js +109 -0
  103. package/dist/src/providers/email/sendgrid.js.map +1 -0
  104. package/dist/src/providers/email/ses.d.ts +39 -0
  105. package/dist/src/providers/email/ses.js +123 -0
  106. package/dist/src/providers/email/ses.js.map +1 -0
  107. package/dist/src/providers/factory.d.ts +14 -0
  108. package/dist/src/providers/factory.js +32 -0
  109. package/dist/src/providers/factory.js.map +1 -0
  110. package/dist/src/records.d.ts +35 -0
  111. package/dist/src/records.js +109 -0
  112. package/dist/src/records.js.map +1 -0
  113. package/dist/src/server.d.ts +67 -0
  114. package/dist/src/server.js +301 -0
  115. package/dist/src/server.js.map +1 -0
  116. package/dist/src/types.d.ts +75 -0
  117. package/dist/src/types.js +2 -0
  118. package/dist/src/types.js.map +1 -0
  119. package/dist/src/xml.d.ts +6 -0
  120. package/dist/src/xml.js +23 -0
  121. package/dist/src/xml.js.map +1 -0
  122. package/docs/billing.md +43 -0
  123. package/docs/getting-started.md +66 -0
  124. package/docs/hosted-api.md +192 -0
  125. package/docs/library.md +253 -0
  126. package/docs/self-hosting.md +153 -0
  127. package/docs/widget.md +121 -0
  128. package/package.json +63 -4
  129. package/web/dashboard.html +669 -0
  130. package/web/index.html +697 -0
  131. package/web/widget-frame.html +480 -0
  132. package/web/widget.js +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/hosted/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function isPrivateAddress(address: string): boolean;
2
+ /**
3
+ * Webhook targets are customer-controlled, so they must be https and resolve
4
+ * only to public addresses; otherwise the server could be aimed at its own
5
+ * network. Checked when saved and again before each delivery.
6
+ */
7
+ export declare function assertPublicHttpsUrl(raw: string, { allowPrivate }?: {
8
+ allowPrivate?: boolean | undefined;
9
+ }): Promise<URL>;
@@ -0,0 +1,60 @@
1
+ import { lookup } from 'node:dns/promises';
2
+ import { BlockList, isIP } from 'node:net';
3
+ import { ConfigError } from '../errors.js';
4
+ const PRIVATE = new BlockList();
5
+ for (const [net, prefix] of [
6
+ ['0.0.0.0', 8], ['10.0.0.0', 8], ['100.64.0.0', 10], ['127.0.0.0', 8], ['169.254.0.0', 16], ['172.16.0.0', 12],
7
+ ['192.0.0.0', 24], ['192.168.0.0', 16], ['198.18.0.0', 15], ['224.0.0.0', 4], ['240.0.0.0', 4],
8
+ ])
9
+ PRIVATE.addSubnet(net, prefix, 'ipv4');
10
+ for (const [net, prefix] of [
11
+ ['::', 128], ['::1', 128], ['64:ff9b::', 96], ['fc00::', 7], ['fe80::', 10], ['ff00::', 8],
12
+ ])
13
+ PRIVATE.addSubnet(net, prefix, 'ipv6');
14
+ export function isPrivateAddress(address) {
15
+ // IPv4-mapped IPv6 (::ffff:a.b.c.d) is judged by its IPv4 part. Not done via a
16
+ // ::ffff:0:0/96 rule: BlockList would then match every plain IPv4 address too.
17
+ const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(address);
18
+ if (mapped)
19
+ return isPrivateAddress(mapped[1]);
20
+ const family = isIP(address);
21
+ if (family === 0)
22
+ return true;
23
+ return PRIVATE.check(address, family === 4 ? 'ipv4' : 'ipv6');
24
+ }
25
+ /**
26
+ * Webhook targets are customer-controlled, so they must be https and resolve
27
+ * only to public addresses; otherwise the server could be aimed at its own
28
+ * network. Checked when saved and again before each delivery.
29
+ */
30
+ export async function assertPublicHttpsUrl(raw, { allowPrivate = false } = {}) {
31
+ let url;
32
+ try {
33
+ url = new URL(raw);
34
+ }
35
+ catch {
36
+ throw new ConfigError('webhook_url must be a valid URL.');
37
+ }
38
+ if (allowPrivate) {
39
+ if (url.protocol !== 'https:' && url.protocol !== 'http:')
40
+ throw new ConfigError('webhook_url must be http(s).');
41
+ return url;
42
+ }
43
+ if (url.protocol !== 'https:')
44
+ throw new ConfigError('webhook_url must use https.');
45
+ if (url.username || url.password)
46
+ throw new ConfigError('webhook_url must not contain credentials.');
47
+ const host = url.hostname.replace(/^\[|\]$/g, '');
48
+ let addresses;
49
+ try {
50
+ addresses = isIP(host) ? [host] : (await lookup(host, { all: true, verbatim: true })).map((a) => a.address);
51
+ }
52
+ catch {
53
+ throw new ConfigError(`webhook_url host ${host} does not resolve.`);
54
+ }
55
+ if (addresses.length === 0 || addresses.some(isPrivateAddress)) {
56
+ throw new ConfigError('webhook_url must resolve to a public IP address.');
57
+ }
58
+ return url;
59
+ }
60
+ //# sourceMappingURL=net.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"net.js","sourceRoot":"","sources":["../../../src/hosted/net.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { Pool, PoolConfig } from 'pg';
2
+ import { type DashboardSession, type LoginToken, type UsageQuery, type UsageRecord, type UsageRow, type Account, type DomainEvent, type DomainRow, type ListDomainsQuery, type Store, type WebhookDelivery, type WidgetSession } from './store.js';
3
+ export interface PostgresStoreOptions {
4
+ connectionString?: string;
5
+ /** Bring your own pool (it won't be closed by `close()`). */
6
+ pool?: Pool;
7
+ /** Extra pg pool settings, e.g. `ssl` or `max`. */
8
+ poolConfig?: PoolConfig;
9
+ }
10
+ /**
11
+ * Postgres-backed store for running the API and workers on several hosts.
12
+ * Job claiming uses FOR UPDATE SKIP LOCKED, so workers never take the same row.
13
+ */
14
+ export declare class PostgresStore implements Store {
15
+ private readonly pool;
16
+ private readonly ownsPool;
17
+ private constructor();
18
+ static connect(opts: PostgresStoreOptions): Promise<PostgresStore>;
19
+ /** Creates or upgrades the schema. Safe when several instances start at once. */
20
+ migrate(): Promise<void>;
21
+ createAccount(account: Account): Promise<void>;
22
+ getAccount(id: string): Promise<Account | undefined>;
23
+ getAccountByKeyHash(hash: string): Promise<Account | undefined>;
24
+ updateAccount(id: string, patch: Partial<Account>): Promise<void>;
25
+ insertDomain(domain: DomainRow): Promise<void>;
26
+ getDomain(accountId: string, id: string): Promise<DomainRow | undefined>;
27
+ findDomain(accountId: string, domain: string, subdomain: string | null): Promise<DomainRow | undefined>;
28
+ listDomains(accountId: string, query: ListDomainsQuery): Promise<{
29
+ domains: DomainRow[];
30
+ next: string | null;
31
+ }>;
32
+ updateDomain(id: string, patch: Partial<DomainRow>): Promise<DomainRow>;
33
+ deleteDomain(id: string): Promise<void>;
34
+ claimDueDomains(now: number, limit: number, leaseMs: number): Promise<DomainRow[]>;
35
+ addEvent(event: DomainEvent): Promise<void>;
36
+ listEvents(domainId: string, limit: number): Promise<DomainEvent[]>;
37
+ addDelivery(delivery: WebhookDelivery): Promise<void>;
38
+ claimDueDeliveries(now: number, limit: number, leaseMs: number): Promise<WebhookDelivery[]>;
39
+ updateDelivery(id: string, patch: Partial<WebhookDelivery>): Promise<void>;
40
+ createWidgetSession(session: WidgetSession): Promise<void>;
41
+ getWidgetSessionByHash(hash: string): Promise<WidgetSession | undefined>;
42
+ updateWidgetSession(id: string, patch: Partial<WidgetSession>): Promise<void>;
43
+ listAccounts(): Promise<Account[]>;
44
+ countDomains(accountId: string): Promise<number>;
45
+ recordUsage(records: UsageRecord[]): Promise<void>;
46
+ recordActiveDomainDays(day: string, now: number): Promise<void>;
47
+ summarizeUsage(query: UsageQuery): Promise<UsageRow[]>;
48
+ getAccountByEmail(email: string): Promise<Account | undefined>;
49
+ getAccountByBillingCustomer(customerId: string): Promise<Account | undefined>;
50
+ listBillableAccounts(): Promise<Account[]>;
51
+ createLoginToken(token: LoginToken): Promise<void>;
52
+ consumeLoginToken(tokenHash: string, now: number): Promise<LoginToken | undefined>;
53
+ createDashboardSession(session: DashboardSession): Promise<void>;
54
+ getDashboardSession(tokenHash: string): Promise<DashboardSession | undefined>;
55
+ deleteDashboardSession(tokenHash: string): Promise<void>;
56
+ markBillingEventProcessed(eventId: string, now: number): Promise<boolean>;
57
+ close(): Promise<void>;
58
+ private one;
59
+ private insert;
60
+ private update;
61
+ private withClient;
62
+ }
@@ -0,0 +1,387 @@
1
+ import { ConfigError } from '../errors.js';
2
+ import { ACCOUNT_BILLING_COLUMNS, ACCOUNT_COLUMNS, DASHBOARD_SESSION_COLUMNS, LOGIN_TOKEN_COLUMNS, DELIVERY_COLUMNS, DOMAIN_COLUMNS, DuplicateError, EVENT_COLUMNS, fromColumns, jsonFallback, SESSION_COLUMNS, toColumns, toUsageRow, USAGE_COLUMNS, usageSql, } from './store.js';
3
+ // Each statement is idempotent; they run in order under an advisory lock.
4
+ const MIGRATIONS = [
5
+ `CREATE TABLE IF NOT EXISTS accounts (
6
+ id TEXT PRIMARY KEY,
7
+ name TEXT NOT NULL,
8
+ api_key_hash TEXT NOT NULL UNIQUE,
9
+ sendgrid_api_key_enc TEXT,
10
+ webhook_url TEXT,
11
+ webhook_secret TEXT NOT NULL,
12
+ widget_origins JSONB NOT NULL DEFAULT '[]',
13
+ created_at BIGINT NOT NULL
14
+ )`,
15
+ `CREATE TABLE IF NOT EXISTS domains (
16
+ id TEXT PRIMARY KEY,
17
+ account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
18
+ domain TEXT NOT NULL,
19
+ subdomain TEXT NOT NULL DEFAULT '',
20
+ tenant_id TEXT,
21
+ metadata JSONB NOT NULL DEFAULT '{}',
22
+ status TEXT NOT NULL,
23
+ sendgrid_domain_id TEXT NOT NULL,
24
+ sendgrid_subuser TEXT,
25
+ dns_provider TEXT NOT NULL,
26
+ dns_credentials_enc TEXT,
27
+ inbound JSONB,
28
+ overwrite BOOLEAN NOT NULL DEFAULT false,
29
+ records JSONB NOT NULL DEFAULT '[]',
30
+ pending JSONB NOT NULL DEFAULT '[]',
31
+ validation JSONB,
32
+ conflicts JSONB,
33
+ last_error TEXT,
34
+ attempts INTEGER NOT NULL DEFAULT 0,
35
+ next_run_at BIGINT,
36
+ locked_until BIGINT,
37
+ verified_at BIGINT,
38
+ expires_at BIGINT,
39
+ created_at BIGINT NOT NULL,
40
+ updated_at BIGINT NOT NULL,
41
+ UNIQUE (account_id, domain, subdomain)
42
+ )`,
43
+ `CREATE INDEX IF NOT EXISTS domains_due ON domains (next_run_at) WHERE next_run_at IS NOT NULL`,
44
+ `CREATE INDEX IF NOT EXISTS domains_by_account ON domains (account_id, created_at DESC, id DESC)`,
45
+ `CREATE INDEX IF NOT EXISTS domains_by_tenant ON domains (account_id, tenant_id)`,
46
+ `CREATE TABLE IF NOT EXISTS events (
47
+ seq BIGSERIAL,
48
+ id TEXT PRIMARY KEY,
49
+ domain_id TEXT NOT NULL,
50
+ account_id TEXT NOT NULL,
51
+ type TEXT NOT NULL,
52
+ data JSONB NOT NULL,
53
+ created_at BIGINT NOT NULL
54
+ )`,
55
+ `CREATE INDEX IF NOT EXISTS events_by_domain ON events (domain_id, created_at DESC, seq DESC)`,
56
+ `CREATE TABLE IF NOT EXISTS webhook_deliveries (
57
+ id TEXT PRIMARY KEY,
58
+ account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
59
+ event_id TEXT NOT NULL,
60
+ url TEXT NOT NULL,
61
+ payload TEXT NOT NULL,
62
+ status TEXT NOT NULL,
63
+ attempts INTEGER NOT NULL DEFAULT 0,
64
+ next_attempt_at BIGINT,
65
+ locked_until BIGINT,
66
+ last_error TEXT,
67
+ response_status INTEGER,
68
+ created_at BIGINT NOT NULL
69
+ )`,
70
+ `CREATE INDEX IF NOT EXISTS deliveries_due ON webhook_deliveries (next_attempt_at) WHERE status = 'pending'`,
71
+ `CREATE TABLE IF NOT EXISTS widget_sessions (
72
+ id TEXT PRIMARY KEY,
73
+ account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
74
+ token_hash TEXT NOT NULL UNIQUE,
75
+ domain_id TEXT,
76
+ defaults JSONB,
77
+ expires_at BIGINT NOT NULL,
78
+ created_at BIGINT NOT NULL
79
+ )`,
80
+ `CREATE INDEX IF NOT EXISTS widget_sessions_by_domain ON widget_sessions (domain_id)`,
81
+ `ALTER TABLE accounts ADD COLUMN IF NOT EXISTS domain_limit INTEGER`,
82
+ `CREATE TABLE IF NOT EXISTS usage_records (
83
+ id TEXT PRIMARY KEY,
84
+ account_id TEXT NOT NULL,
85
+ tenant_id TEXT,
86
+ domain_id TEXT NOT NULL,
87
+ domain TEXT NOT NULL,
88
+ metric TEXT NOT NULL,
89
+ quantity INTEGER NOT NULL,
90
+ day TEXT NOT NULL,
91
+ occurred_at BIGINT NOT NULL
92
+ )`,
93
+ `CREATE INDEX IF NOT EXISTS usage_by_account_day ON usage_records (account_id, day)`,
94
+ ...ACCOUNT_BILLING_COLUMNS.map(([column, , postgres]) => `ALTER TABLE accounts ADD COLUMN IF NOT EXISTS ${column} ${postgres}`),
95
+ `CREATE UNIQUE INDEX IF NOT EXISTS accounts_by_email ON accounts (email)`,
96
+ // Legacy SendGrid keys move to the generic credentials column (idempotent).
97
+ `UPDATE accounts SET email_credentials_enc = sendgrid_api_key_enc
98
+ WHERE email_credentials_enc IS NULL AND sendgrid_api_key_enc IS NOT NULL`,
99
+ `CREATE INDEX IF NOT EXISTS accounts_by_billing_customer ON accounts (billing_customer_id)`,
100
+ `CREATE TABLE IF NOT EXISTS login_tokens (
101
+ token_hash TEXT PRIMARY KEY,
102
+ email TEXT NOT NULL,
103
+ name TEXT,
104
+ expires_at BIGINT NOT NULL,
105
+ used_at BIGINT,
106
+ created_at BIGINT NOT NULL
107
+ )`,
108
+ `CREATE TABLE IF NOT EXISTS dashboard_sessions (
109
+ token_hash TEXT PRIMARY KEY,
110
+ account_id TEXT NOT NULL REFERENCES accounts(id) ON DELETE CASCADE,
111
+ expires_at BIGINT NOT NULL,
112
+ created_at BIGINT NOT NULL
113
+ )`,
114
+ `CREATE TABLE IF NOT EXISTS billing_events (
115
+ id TEXT PRIMARY KEY,
116
+ processed_at BIGINT NOT NULL
117
+ )`,
118
+ ];
119
+ /** Arbitrary constant identifying this app's migration lock. */
120
+ const MIGRATION_LOCK = 7_310_455_201;
121
+ const UNIQUE_VIOLATION = '23505';
122
+ function encode(kind, v) {
123
+ if (kind === 'bool')
124
+ return Boolean(v);
125
+ if (kind === 'emptyAsNull')
126
+ return v ?? '';
127
+ // Always stringify JSON: pg would send JS arrays as Postgres arrays, not JSON.
128
+ if (typeof kind === 'object')
129
+ return v === null ? null : JSON.stringify(v);
130
+ return v ?? null;
131
+ }
132
+ function decode(kind, v) {
133
+ if (kind === 'int')
134
+ return v === null || v === undefined ? null : Number(v); // BIGINT arrives as a string
135
+ if (kind === 'bool')
136
+ return v === true;
137
+ if (kind === 'emptyAsNull')
138
+ return v === '' ? null : v;
139
+ if (typeof kind === 'object')
140
+ return v === null || v === undefined ? jsonFallback(kind) : v; // JSONB arrives parsed
141
+ return v ?? null;
142
+ }
143
+ const toRow = (map, value) => toColumns(map, value, encode);
144
+ const fromRow = (map, row) => fromColumns(map, row, decode);
145
+ /**
146
+ * Postgres-backed store for running the API and workers on several hosts.
147
+ * Job claiming uses FOR UPDATE SKIP LOCKED, so workers never take the same row.
148
+ */
149
+ export class PostgresStore {
150
+ pool;
151
+ ownsPool;
152
+ constructor(pool, ownsPool) {
153
+ this.pool = pool;
154
+ this.ownsPool = ownsPool;
155
+ }
156
+ static async connect(opts) {
157
+ let pool = opts.pool;
158
+ if (!pool) {
159
+ let pg;
160
+ try {
161
+ pg = (await import('pg')).default;
162
+ }
163
+ catch {
164
+ throw new ConfigError('PostgreSQL support needs the "pg" package: npm install pg');
165
+ }
166
+ pool = new pg.Pool({ connectionString: opts.connectionString, max: 10, ...opts.poolConfig });
167
+ }
168
+ const store = new PostgresStore(pool, !opts.pool);
169
+ await store.migrate();
170
+ return store;
171
+ }
172
+ /** Creates or upgrades the schema. Safe when several instances start at once. */
173
+ async migrate() {
174
+ await this.withClient(async (client) => {
175
+ await client.query('SELECT pg_advisory_lock($1)', [MIGRATION_LOCK]);
176
+ try {
177
+ for (const sql of MIGRATIONS)
178
+ await client.query(sql);
179
+ }
180
+ finally {
181
+ await client.query('SELECT pg_advisory_unlock($1)', [MIGRATION_LOCK]);
182
+ }
183
+ });
184
+ }
185
+ async createAccount(account) {
186
+ await this.insert('accounts', toRow(ACCOUNT_COLUMNS, account));
187
+ }
188
+ async getAccount(id) {
189
+ return fromRow(ACCOUNT_COLUMNS, await this.one('SELECT * FROM accounts WHERE id = $1', [id]));
190
+ }
191
+ async getAccountByKeyHash(hash) {
192
+ return fromRow(ACCOUNT_COLUMNS, await this.one('SELECT * FROM accounts WHERE api_key_hash = $1', [hash]));
193
+ }
194
+ async updateAccount(id, patch) {
195
+ await this.update('accounts', id, toRow(ACCOUNT_COLUMNS, patch));
196
+ }
197
+ async insertDomain(domain) {
198
+ try {
199
+ await this.insert('domains', toRow(DOMAIN_COLUMNS, domain));
200
+ }
201
+ catch (err) {
202
+ if (err.code === UNIQUE_VIOLATION)
203
+ throw new DuplicateError('Domain already registered');
204
+ throw err;
205
+ }
206
+ }
207
+ async getDomain(accountId, id) {
208
+ return fromRow(DOMAIN_COLUMNS, await this.one('SELECT * FROM domains WHERE account_id = $1 AND id = $2', [accountId, id]));
209
+ }
210
+ async findDomain(accountId, domain, subdomain) {
211
+ const row = await this.one('SELECT * FROM domains WHERE account_id = $1 AND domain = $2 AND subdomain = $3', [accountId, domain, subdomain ?? '']);
212
+ return fromRow(DOMAIN_COLUMNS, row);
213
+ }
214
+ async listDomains(accountId, query) {
215
+ const params = [accountId];
216
+ const where = ['account_id = $1'];
217
+ const param = (v) => `$${params.push(v)}`;
218
+ if (query.tenantId)
219
+ where.push(`tenant_id = ${param(query.tenantId)}`);
220
+ if (query.status)
221
+ where.push(`status = ${param(query.status)}`);
222
+ if (query.after) {
223
+ const [createdAt, id] = Buffer.from(query.after, 'base64url').toString('utf8').split(':');
224
+ const at = Number(createdAt);
225
+ if (!Number.isFinite(at))
226
+ return { domains: [], next: null };
227
+ where.push(`(created_at, id) < (${param(at)}, ${param(id ?? '')})`);
228
+ }
229
+ const { rows } = await this.pool.query(`SELECT * FROM domains WHERE ${where.join(' AND ')} ORDER BY created_at DESC, id DESC LIMIT ${param(query.limit + 1)}`, params);
230
+ const domains = rows.slice(0, query.limit).map((r) => fromRow(DOMAIN_COLUMNS, r));
231
+ const last = domains.at(-1);
232
+ const next = rows.length > query.limit && last ? Buffer.from(`${last.createdAt}:${last.id}`).toString('base64url') : null;
233
+ return { domains, next };
234
+ }
235
+ async updateDomain(id, patch) {
236
+ const row = toRow(DOMAIN_COLUMNS, patch);
237
+ const columns = Object.keys(row);
238
+ const result = columns.length === 0
239
+ ? await this.pool.query('SELECT * FROM domains WHERE id = $1', [id])
240
+ : await this.pool.query(`UPDATE domains SET ${columns.map((c, i) => `${c} = $${i + 2}`).join(', ')} WHERE id = $1 RETURNING *`, [id, ...columns.map((c) => row[c])]);
241
+ return fromRow(DOMAIN_COLUMNS, result.rows[0]);
242
+ }
243
+ async deleteDomain(id) {
244
+ await this.withClient(async (client) => {
245
+ await client.query('BEGIN');
246
+ try {
247
+ await client.query('DELETE FROM events WHERE domain_id = $1', [id]);
248
+ await client.query('DELETE FROM widget_sessions WHERE domain_id = $1', [id]);
249
+ await client.query('DELETE FROM domains WHERE id = $1', [id]);
250
+ await client.query('COMMIT');
251
+ }
252
+ catch (err) {
253
+ await client.query('ROLLBACK');
254
+ throw err;
255
+ }
256
+ });
257
+ }
258
+ async claimDueDomains(now, limit, leaseMs) {
259
+ const { rows } = await this.pool.query(`UPDATE domains SET locked_until = $1
260
+ WHERE id IN (
261
+ SELECT id FROM domains
262
+ WHERE next_run_at IS NOT NULL AND next_run_at <= $2 AND (locked_until IS NULL OR locked_until < $2)
263
+ ORDER BY next_run_at
264
+ LIMIT $3
265
+ FOR UPDATE SKIP LOCKED
266
+ )
267
+ RETURNING *`, [now + leaseMs, now, limit]);
268
+ return rows.map((r) => fromRow(DOMAIN_COLUMNS, r));
269
+ }
270
+ async addEvent(event) {
271
+ await this.insert('events', toRow(EVENT_COLUMNS, event));
272
+ }
273
+ async listEvents(domainId, limit) {
274
+ const { rows } = await this.pool.query('SELECT * FROM events WHERE domain_id = $1 ORDER BY created_at DESC, seq DESC LIMIT $2', [domainId, limit]);
275
+ return rows.map((r) => fromRow(EVENT_COLUMNS, r));
276
+ }
277
+ async addDelivery(delivery) {
278
+ await this.insert('webhook_deliveries', toRow(DELIVERY_COLUMNS, delivery));
279
+ }
280
+ async claimDueDeliveries(now, limit, leaseMs) {
281
+ const { rows } = await this.pool.query(`UPDATE webhook_deliveries SET locked_until = $1
282
+ WHERE id IN (
283
+ SELECT id FROM webhook_deliveries
284
+ WHERE status = 'pending' AND next_attempt_at <= $2 AND (locked_until IS NULL OR locked_until < $2)
285
+ ORDER BY next_attempt_at
286
+ LIMIT $3
287
+ FOR UPDATE SKIP LOCKED
288
+ )
289
+ RETURNING *`, [now + leaseMs, now, limit]);
290
+ return rows.map((r) => fromRow(DELIVERY_COLUMNS, r));
291
+ }
292
+ async updateDelivery(id, patch) {
293
+ await this.update('webhook_deliveries', id, toRow(DELIVERY_COLUMNS, patch));
294
+ }
295
+ async createWidgetSession(session) {
296
+ await this.insert('widget_sessions', toRow(SESSION_COLUMNS, session));
297
+ }
298
+ async getWidgetSessionByHash(hash) {
299
+ return fromRow(SESSION_COLUMNS, await this.one('SELECT * FROM widget_sessions WHERE token_hash = $1', [hash]));
300
+ }
301
+ async updateWidgetSession(id, patch) {
302
+ await this.update('widget_sessions', id, toRow(SESSION_COLUMNS, patch));
303
+ }
304
+ async listAccounts() {
305
+ const { rows } = await this.pool.query('SELECT * FROM accounts ORDER BY created_at, id');
306
+ return rows.map((r) => fromRow(ACCOUNT_COLUMNS, r));
307
+ }
308
+ async countDomains(accountId) {
309
+ return Number((await this.one('SELECT COUNT(*) AS n FROM domains WHERE account_id = $1', [accountId])).n);
310
+ }
311
+ async recordUsage(records) {
312
+ for (const record of records) {
313
+ const row = toRow(USAGE_COLUMNS, record);
314
+ const columns = Object.keys(row);
315
+ await this.pool.query(`INSERT INTO usage_records (${columns.join(', ')}) VALUES (${columns.map((_, i) => `$${i + 1}`).join(', ')})
316
+ ON CONFLICT (id) DO NOTHING`, columns.map((c) => row[c]));
317
+ }
318
+ }
319
+ async recordActiveDomainDays(day, now) {
320
+ await this.pool.query(`INSERT INTO usage_records (id, account_id, tenant_id, domain_id, domain, metric, quantity, day, occurred_at)
321
+ SELECT 'active_domain_day:' || id || ':' || $1, account_id, tenant_id, id, domain, 'active_domain_day', 1, $1, $2
322
+ FROM domains WHERE status = 'verified'
323
+ ON CONFLICT (id) DO NOTHING`, [day, now]);
324
+ }
325
+ async summarizeUsage(query) {
326
+ const params = [query.from, query.to, ...(query.accountId ? [query.accountId] : [])];
327
+ const { rows } = await this.pool.query(usageSql(query, (n) => `$${n}`), params);
328
+ return rows.map((r) => toUsageRow(r, Boolean(query.groupByTenant)));
329
+ }
330
+ async getAccountByEmail(email) {
331
+ return fromRow(ACCOUNT_COLUMNS, await this.one('SELECT * FROM accounts WHERE email = $1', [email]));
332
+ }
333
+ async getAccountByBillingCustomer(customerId) {
334
+ return fromRow(ACCOUNT_COLUMNS, await this.one('SELECT * FROM accounts WHERE billing_customer_id = $1', [customerId]));
335
+ }
336
+ async listBillableAccounts() {
337
+ const { rows } = await this.pool.query("SELECT * FROM accounts WHERE billing_status IN ('active', 'past_due') AND billing_customer_id IS NOT NULL ORDER BY id");
338
+ return rows.map((r) => fromRow(ACCOUNT_COLUMNS, r));
339
+ }
340
+ async createLoginToken(token) {
341
+ await this.insert('login_tokens', toRow(LOGIN_TOKEN_COLUMNS, token));
342
+ }
343
+ async consumeLoginToken(tokenHash, now) {
344
+ const row = await this.one('UPDATE login_tokens SET used_at = $1 WHERE token_hash = $2 AND used_at IS NULL AND expires_at > $1 RETURNING *', [now, tokenHash]);
345
+ return fromRow(LOGIN_TOKEN_COLUMNS, row);
346
+ }
347
+ async createDashboardSession(session) {
348
+ await this.insert('dashboard_sessions', toRow(DASHBOARD_SESSION_COLUMNS, session));
349
+ }
350
+ async getDashboardSession(tokenHash) {
351
+ return fromRow(DASHBOARD_SESSION_COLUMNS, await this.one('SELECT * FROM dashboard_sessions WHERE token_hash = $1', [tokenHash]));
352
+ }
353
+ async deleteDashboardSession(tokenHash) {
354
+ await this.pool.query('DELETE FROM dashboard_sessions WHERE token_hash = $1', [tokenHash]);
355
+ }
356
+ async markBillingEventProcessed(eventId, now) {
357
+ const { rowCount } = await this.pool.query('INSERT INTO billing_events (id, processed_at) VALUES ($1, $2) ON CONFLICT (id) DO NOTHING', [eventId, now]);
358
+ return rowCount === 1;
359
+ }
360
+ async close() {
361
+ if (this.ownsPool)
362
+ await this.pool.end();
363
+ }
364
+ async one(sql, params) {
365
+ return (await this.pool.query(sql, params)).rows[0];
366
+ }
367
+ async insert(table, row) {
368
+ const columns = Object.keys(row);
369
+ await this.pool.query(`INSERT INTO ${table} (${columns.join(', ')}) VALUES (${columns.map((_, i) => `$${i + 1}`).join(', ')})`, columns.map((c) => row[c]));
370
+ }
371
+ async update(table, id, row) {
372
+ const columns = Object.keys(row);
373
+ if (columns.length === 0)
374
+ return;
375
+ await this.pool.query(`UPDATE ${table} SET ${columns.map((c, i) => `${c} = $${i + 2}`).join(', ')} WHERE id = $1`, [id, ...columns.map((c) => row[c])]);
376
+ }
377
+ async withClient(fn) {
378
+ const client = await this.pool.connect();
379
+ try {
380
+ return await fn(client);
381
+ }
382
+ finally {
383
+ client.release();
384
+ }
385
+ }
386
+ }
387
+ //# sourceMappingURL=postgres-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgres-store.js","sourceRoot":"","sources":["../../../src/hosted/postgres-store.ts"],"names":[],"mappings":"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"}