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.
- package/README.md +161 -2
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +398 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/dns-host.d.ts +10 -0
- package/dist/src/dns-host.js +31 -0
- package/dist/src/dns-host.js.map +1 -0
- package/dist/src/errors.d.ts +17 -0
- package/dist/src/errors.js +51 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/hosted/api.d.ts +107 -0
- package/dist/src/hosted/api.js +919 -0
- package/dist/src/hosted/api.js.map +1 -0
- package/dist/src/hosted/auth.d.ts +80 -0
- package/dist/src/hosted/auth.js +147 -0
- package/dist/src/hosted/auth.js.map +1 -0
- package/dist/src/hosted/billing-dodo.d.ts +58 -0
- package/dist/src/hosted/billing-dodo.js +139 -0
- package/dist/src/hosted/billing-dodo.js.map +1 -0
- package/dist/src/hosted/billing-stripe.d.ts +82 -0
- package/dist/src/hosted/billing-stripe.js +205 -0
- package/dist/src/hosted/billing-stripe.js.map +1 -0
- package/dist/src/hosted/billing.d.ts +114 -0
- package/dist/src/hosted/billing.js +173 -0
- package/dist/src/hosted/billing.js.map +1 -0
- package/dist/src/hosted/bulk.d.ts +47 -0
- package/dist/src/hosted/bulk.js +66 -0
- package/dist/src/hosted/bulk.js.map +1 -0
- package/dist/src/hosted/cli.d.ts +2 -0
- package/dist/src/hosted/cli.js +318 -0
- package/dist/src/hosted/cli.js.map +1 -0
- package/dist/src/hosted/crypto.d.ts +22 -0
- package/dist/src/hosted/crypto.js +55 -0
- package/dist/src/hosted/crypto.js.map +1 -0
- package/dist/src/hosted/index.d.ts +7 -0
- package/dist/src/hosted/index.js +11 -0
- package/dist/src/hosted/index.js.map +1 -0
- package/dist/src/hosted/markdown.d.ts +16 -0
- package/dist/src/hosted/markdown.js +168 -0
- package/dist/src/hosted/markdown.js.map +1 -0
- package/dist/src/hosted/net.d.ts +9 -0
- package/dist/src/hosted/net.js +60 -0
- package/dist/src/hosted/net.js.map +1 -0
- package/dist/src/hosted/postgres-store.d.ts +62 -0
- package/dist/src/hosted/postgres-store.js +387 -0
- package/dist/src/hosted/postgres-store.js.map +1 -0
- package/dist/src/hosted/serialize.d.ts +144 -0
- package/dist/src/hosted/serialize.js +126 -0
- package/dist/src/hosted/serialize.js.map +1 -0
- package/dist/src/hosted/service.d.ts +170 -0
- package/dist/src/hosted/service.js +603 -0
- package/dist/src/hosted/service.js.map +1 -0
- package/dist/src/hosted/site.d.ts +84 -0
- package/dist/src/hosted/site.js +653 -0
- package/dist/src/hosted/site.js.map +1 -0
- package/dist/src/hosted/sqlite-store.d.ts +45 -0
- package/dist/src/hosted/sqlite-store.js +351 -0
- package/dist/src/hosted/sqlite-store.js.map +1 -0
- package/dist/src/hosted/store.d.ts +257 -0
- package/dist/src/hosted/store.js +181 -0
- package/dist/src/hosted/store.js.map +1 -0
- package/dist/src/hosted/widget.d.ts +46 -0
- package/dist/src/hosted/widget.js +130 -0
- package/dist/src/hosted/widget.js.map +1 -0
- package/dist/src/hosted/worker.d.ts +45 -0
- package/dist/src/hosted/worker.js +142 -0
- package/dist/src/hosted/worker.js.map +1 -0
- package/dist/src/http.d.ts +14 -0
- package/dist/src/http.js +54 -0
- package/dist/src/http.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/orchestrator.d.ts +70 -0
- package/dist/src/orchestrator.js +69 -0
- package/dist/src/orchestrator.js.map +1 -0
- package/dist/src/propagation.d.ts +30 -0
- package/dist/src/propagation.js +76 -0
- package/dist/src/propagation.js.map +1 -0
- package/dist/src/providers/dns/aws.d.ts +28 -0
- package/dist/src/providers/dns/aws.js +103 -0
- package/dist/src/providers/dns/aws.js.map +1 -0
- package/dist/src/providers/dns/cloudflare.d.ts +26 -0
- package/dist/src/providers/dns/cloudflare.js +97 -0
- package/dist/src/providers/dns/cloudflare.js.map +1 -0
- package/dist/src/providers/dns/manual.d.ts +12 -0
- package/dist/src/providers/dns/manual.js +18 -0
- package/dist/src/providers/dns/manual.js.map +1 -0
- package/dist/src/providers/dns/route53.d.ts +34 -0
- package/dist/src/providers/dns/route53.js +176 -0
- package/dist/src/providers/dns/route53.js.map +1 -0
- package/dist/src/providers/email/factory.d.ts +29 -0
- package/dist/src/providers/email/factory.js +67 -0
- package/dist/src/providers/email/factory.js.map +1 -0
- package/dist/src/providers/email/mailgun.d.ts +36 -0
- package/dist/src/providers/email/mailgun.js +141 -0
- package/dist/src/providers/email/mailgun.js.map +1 -0
- package/dist/src/providers/email/postmark.d.ts +37 -0
- package/dist/src/providers/email/postmark.js +121 -0
- package/dist/src/providers/email/postmark.js.map +1 -0
- package/dist/src/providers/email/sendgrid.d.ts +31 -0
- package/dist/src/providers/email/sendgrid.js +109 -0
- package/dist/src/providers/email/sendgrid.js.map +1 -0
- package/dist/src/providers/email/ses.d.ts +39 -0
- package/dist/src/providers/email/ses.js +123 -0
- package/dist/src/providers/email/ses.js.map +1 -0
- package/dist/src/providers/factory.d.ts +14 -0
- package/dist/src/providers/factory.js +32 -0
- package/dist/src/providers/factory.js.map +1 -0
- package/dist/src/records.d.ts +35 -0
- package/dist/src/records.js +109 -0
- package/dist/src/records.js.map +1 -0
- package/dist/src/server.d.ts +67 -0
- package/dist/src/server.js +301 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/types.d.ts +75 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/xml.d.ts +6 -0
- package/dist/src/xml.js +23 -0
- package/dist/src/xml.js.map +1 -0
- package/docs/billing.md +43 -0
- package/docs/getting-started.md +66 -0
- package/docs/hosted-api.md +192 -0
- package/docs/library.md +253 -0
- package/docs/self-hosting.md +153 -0
- package/docs/widget.md +121 -0
- package/package.json +63 -4
- package/web/dashboard.html +669 -0
- package/web/index.html +697 -0
- package/web/widget-frame.html +480 -0
- package/web/widget.js +91 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PlannedChange } from './types.js';
|
|
2
|
+
export declare class ApiError extends Error {
|
|
3
|
+
readonly provider: string;
|
|
4
|
+
readonly status: number;
|
|
5
|
+
readonly body?: unknown | undefined;
|
|
6
|
+
constructor(provider: string, status: number, message: string, body?: unknown | undefined);
|
|
7
|
+
}
|
|
8
|
+
export declare class DnsConflictError extends Error {
|
|
9
|
+
readonly conflicts: PlannedChange[];
|
|
10
|
+
constructor(conflicts: PlannedChange[]);
|
|
11
|
+
}
|
|
12
|
+
/** Missing or invalid configuration (credentials, options) — the user's to fix. */
|
|
13
|
+
export declare class ConfigError extends Error {
|
|
14
|
+
constructor(message: string);
|
|
15
|
+
}
|
|
16
|
+
/** What to check when a provider rejects the credentials. */
|
|
17
|
+
export declare function apiErrorHint(err: ApiError): string | undefined;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { describeRecord } from './records.js';
|
|
2
|
+
export class ApiError extends Error {
|
|
3
|
+
provider;
|
|
4
|
+
status;
|
|
5
|
+
body;
|
|
6
|
+
constructor(provider, status, message, body) {
|
|
7
|
+
super(`${provider} API error (${status}): ${message}`);
|
|
8
|
+
this.provider = provider;
|
|
9
|
+
this.status = status;
|
|
10
|
+
this.body = body;
|
|
11
|
+
this.name = 'ApiError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export class DnsConflictError extends Error {
|
|
15
|
+
conflicts;
|
|
16
|
+
constructor(conflicts) {
|
|
17
|
+
const lines = conflicts.map((c) => ` ${describeRecord(c.record)}: ${c.reason}`);
|
|
18
|
+
super(`DNS records conflict with existing ones:\n${lines.join('\n')}`);
|
|
19
|
+
this.conflicts = conflicts;
|
|
20
|
+
this.name = 'DnsConflictError';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Missing or invalid configuration (credentials, options) — the user's to fix. */
|
|
24
|
+
export class ConfigError extends Error {
|
|
25
|
+
constructor(message) {
|
|
26
|
+
super(message);
|
|
27
|
+
this.name = 'ConfigError';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** What to check when a provider rejects the credentials. */
|
|
31
|
+
export function apiErrorHint(err) {
|
|
32
|
+
if (err.status !== 401 && err.status !== 403)
|
|
33
|
+
return undefined;
|
|
34
|
+
switch (err.provider) {
|
|
35
|
+
case 'SendGrid':
|
|
36
|
+
return 'Check the SendGrid API key has Sender Authentication and Inbound Parse permissions.';
|
|
37
|
+
case 'Postmark':
|
|
38
|
+
return 'Check the Postmark account API token (Account → API Tokens, not a server token).';
|
|
39
|
+
case 'Mailgun':
|
|
40
|
+
return 'Check the Mailgun API key, and that the region (US or EU) matches the account.';
|
|
41
|
+
case 'Amazon SES':
|
|
42
|
+
return 'Check the AWS credentials and region, and that they allow ses:CreateEmailIdentity, GetEmailIdentity, PutEmailIdentityMailFromAttributes and DeleteEmailIdentity.';
|
|
43
|
+
case 'Cloudflare':
|
|
44
|
+
return 'Check the Cloudflare token has Zone:Read and DNS:Edit for this zone.';
|
|
45
|
+
case 'Route53':
|
|
46
|
+
return 'Check the AWS credentials allow route53:ListHostedZonesByName, route53:ListResourceRecordSets and route53:ChangeResourceRecordSets.';
|
|
47
|
+
default:
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAG9C,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEtB;IACA;IAEA;IAJX,YACW,QAAgB,EAChB,MAAc,EACvB,OAAe,EACN,IAAc;QAEvB,KAAK,CAAC,GAAG,QAAQ,eAAe,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC;QAL9C,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAQ;QAEd,SAAI,GAAJ,IAAI,CAAU;QAGvB,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACpB;IAArB,YAAqB,SAA0B;QAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACjF,KAAK,CAAC,6CAA6C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAFpD,cAAS,GAAT,SAAS,CAAiB;QAG7C,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,mFAAmF;AACnF,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,UAAU,YAAY,CAAC,GAAa;IACxC,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;QAAE,OAAO,SAAS,CAAC;IAC/D,QAAQ,GAAG,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,UAAU;YACb,OAAO,qFAAqF,CAAC;QAC/F,KAAK,UAAU;YACb,OAAO,kFAAkF,CAAC;QAC5F,KAAK,SAAS;YACZ,OAAO,gFAAgF,CAAC;QAC1F,KAAK,YAAY;YACf,OAAO,kKAAkK,CAAC;QAC5K,KAAK,YAAY;YACf,OAAO,sEAAsE,CAAC;QAChF,KAAK,SAAS;YACZ,OAAO,qIAAqI,CAAC;QAC/I;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type IncomingMessage, type Server, type ServerResponse } from 'node:http';
|
|
2
|
+
import type { FetchLike } from '../http.js';
|
|
3
|
+
import type { DnsHost } from '../dns-host.js';
|
|
4
|
+
import type { DnsLookup } from '../propagation.js';
|
|
5
|
+
import { AccountAuth, type Mailer } from './auth.js';
|
|
6
|
+
import { BillingService, type BillingConfig } from './billing.js';
|
|
7
|
+
import { Site, type SiteOptions } from './site.js';
|
|
8
|
+
import { DomainService, type DomainInput, type Logger, type ProviderFactory } from './service.js';
|
|
9
|
+
import { type Store } from './store.js';
|
|
10
|
+
import { WidgetService } from './widget.js';
|
|
11
|
+
import { BackgroundRunner } from './worker.js';
|
|
12
|
+
export interface WidgetAssets {
|
|
13
|
+
loader: string;
|
|
14
|
+
frame: string;
|
|
15
|
+
dashboard: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function loadWidgetAssets(): WidgetAssets;
|
|
18
|
+
export interface ApiOptions {
|
|
19
|
+
service: DomainService;
|
|
20
|
+
widget: WidgetService;
|
|
21
|
+
/** Self-serve sign-up and the dashboard. Requires publicUrl. */
|
|
22
|
+
auth?: AccountAuth;
|
|
23
|
+
/** Pay-as-you-go billing. Without it there's no free-tier cap and no checkout. */
|
|
24
|
+
billing?: BillingService;
|
|
25
|
+
/** Without billing: a free plan whose domain cap applies, with payments coming soon. */
|
|
26
|
+
freePlan?: FreePlan;
|
|
27
|
+
/** The public website (landing, pricing, docs, legal pages). */
|
|
28
|
+
site?: Site;
|
|
29
|
+
/** Where the website's feedback form is sent. Without `to`, submissions are only logged. */
|
|
30
|
+
feedback?: {
|
|
31
|
+
mailer: Mailer;
|
|
32
|
+
to?: string;
|
|
33
|
+
};
|
|
34
|
+
assets?: WidgetAssets;
|
|
35
|
+
/** Public base URL (e.g. https://api.example.com) used in widget links. Defaults to the request's host. */
|
|
36
|
+
publicUrl?: string;
|
|
37
|
+
/** Requests per second per account, with bursts up to `burst`. */
|
|
38
|
+
rateLimit?: {
|
|
39
|
+
perSecond: number;
|
|
40
|
+
burst: number;
|
|
41
|
+
};
|
|
42
|
+
now?: () => number;
|
|
43
|
+
log?: Logger;
|
|
44
|
+
}
|
|
45
|
+
/** The request handler, separate from the listener so it can be mounted elsewhere. */
|
|
46
|
+
export declare function createApiHandler(opts: ApiOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|
|
47
|
+
/** from/to as inclusive UTC days; defaults to the current calendar month so far. */
|
|
48
|
+
export declare function parseUsagePeriod(query: URLSearchParams, now: number): {
|
|
49
|
+
from: string;
|
|
50
|
+
to: string;
|
|
51
|
+
};
|
|
52
|
+
export declare function parseDomainInput(body: Record<string, unknown>): DomainInput;
|
|
53
|
+
export interface FreePlan {
|
|
54
|
+
freeDomains: number;
|
|
55
|
+
}
|
|
56
|
+
export interface HostedApiOptions {
|
|
57
|
+
/** postgres://… URL, or a SQLite file path (default ':memory:'). Ignored when `store` is given. */
|
|
58
|
+
database?: string;
|
|
59
|
+
store?: Store;
|
|
60
|
+
encryptionKey: string;
|
|
61
|
+
port?: number;
|
|
62
|
+
host?: string;
|
|
63
|
+
/** Run the background runner in this process. Default true. */
|
|
64
|
+
workers?: boolean;
|
|
65
|
+
runner?: {
|
|
66
|
+
concurrency?: number;
|
|
67
|
+
pollMs?: number;
|
|
68
|
+
};
|
|
69
|
+
rateLimit?: {
|
|
70
|
+
perSecond: number;
|
|
71
|
+
burst: number;
|
|
72
|
+
};
|
|
73
|
+
providers?: ProviderFactory;
|
|
74
|
+
lookup?: (domain: string) => Promise<DnsLookup>;
|
|
75
|
+
fetch?: FetchLike;
|
|
76
|
+
now?: () => number;
|
|
77
|
+
allowPrivateWebhooks?: boolean;
|
|
78
|
+
/** Public base URL for widget links (PUBLIC_URL). */
|
|
79
|
+
publicUrl?: string;
|
|
80
|
+
/** Override DNS host detection (tests). */
|
|
81
|
+
detectHost?: (domain: string) => Promise<DnsHost>;
|
|
82
|
+
/** Self-serve sign-up and dashboard (needs publicUrl). Without a mailer, sign-in links are logged. */
|
|
83
|
+
signup?: {
|
|
84
|
+
mailer?: Mailer;
|
|
85
|
+
appName?: string;
|
|
86
|
+
};
|
|
87
|
+
/** Pay-as-you-go billing (needs publicUrl). */
|
|
88
|
+
billing?: BillingConfig;
|
|
89
|
+
/** Before billing launches: cap free accounts at this many domains and show paid plans as coming soon. Ignored with `billing`. */
|
|
90
|
+
freePlan?: FreePlan;
|
|
91
|
+
/** The public website (needs publicUrl). */
|
|
92
|
+
site?: SiteOptions;
|
|
93
|
+
log?: Logger;
|
|
94
|
+
}
|
|
95
|
+
export interface HostedApi {
|
|
96
|
+
url: string;
|
|
97
|
+
port: number;
|
|
98
|
+
server: Server;
|
|
99
|
+
store: Store;
|
|
100
|
+
service: DomainService;
|
|
101
|
+
runner: BackgroundRunner;
|
|
102
|
+
billing?: BillingService;
|
|
103
|
+
auth?: AccountAuth;
|
|
104
|
+
site?: Site;
|
|
105
|
+
close(): Promise<void>;
|
|
106
|
+
}
|
|
107
|
+
export declare function startHostedApi(opts: HostedApiOptions): Promise<HostedApi>;
|