run402 1.40.1 → 1.40.2
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/lib/sdk.mjs +1 -1
- package/package.json +4 -3
- package/sdk/core-dist/allowance-auth.js +129 -0
- package/sdk/core-dist/allowance.js +25 -0
- package/sdk/core-dist/client.js +42 -0
- package/sdk/core-dist/config.js +26 -0
- package/sdk/core-dist/keystore.js +97 -0
- package/sdk/core-dist/wallet-auth.js +62 -0
- package/sdk/core-dist/wallet.js +25 -0
- package/sdk/dist/credentials.d.ts +70 -0
- package/sdk/dist/credentials.d.ts.map +1 -0
- package/sdk/dist/credentials.js +19 -0
- package/sdk/dist/credentials.js.map +1 -0
- package/sdk/dist/errors.d.ts +34 -0
- package/sdk/dist/errors.d.ts.map +1 -0
- package/sdk/dist/errors.js +46 -0
- package/sdk/dist/errors.js.map +1 -0
- package/sdk/dist/index.d.ts +68 -0
- package/sdk/dist/index.d.ts.map +1 -0
- package/sdk/dist/index.js +81 -0
- package/sdk/dist/index.js.map +1 -0
- package/sdk/dist/kernel.d.ts +47 -0
- package/sdk/dist/kernel.d.ts.map +1 -0
- package/sdk/dist/kernel.js +76 -0
- package/sdk/dist/kernel.js.map +1 -0
- package/sdk/dist/namespaces/admin.d.ts +30 -0
- package/sdk/dist/namespaces/admin.d.ts.map +1 -0
- package/sdk/dist/namespaces/admin.js +36 -0
- package/sdk/dist/namespaces/admin.js.map +1 -0
- package/sdk/dist/namespaces/ai.d.ts +57 -0
- package/sdk/dist/namespaces/ai.d.ts.map +1 -0
- package/sdk/dist/namespaces/ai.js +62 -0
- package/sdk/dist/namespaces/ai.js.map +1 -0
- package/sdk/dist/namespaces/allowance.d.ts +51 -0
- package/sdk/dist/namespaces/allowance.d.ts.map +1 -0
- package/sdk/dist/namespaces/allowance.js +116 -0
- package/sdk/dist/namespaces/allowance.js.map +1 -0
- package/sdk/dist/namespaces/apps.d.ts +158 -0
- package/sdk/dist/namespaces/apps.d.ts.map +1 -0
- package/sdk/dist/namespaces/apps.js +150 -0
- package/sdk/dist/namespaces/apps.js.map +1 -0
- package/sdk/dist/namespaces/auth.d.ts +53 -0
- package/sdk/dist/namespaces/auth.d.ts.map +1 -0
- package/sdk/dist/namespaces/auth.js +106 -0
- package/sdk/dist/namespaces/auth.js.map +1 -0
- package/sdk/dist/namespaces/billing.d.ts +64 -0
- package/sdk/dist/namespaces/billing.d.ts.map +1 -0
- package/sdk/dist/namespaces/billing.js +105 -0
- package/sdk/dist/namespaces/billing.js.map +1 -0
- package/sdk/dist/namespaces/blobs.d.ts +41 -0
- package/sdk/dist/namespaces/blobs.d.ts.map +1 -0
- package/sdk/dist/namespaces/blobs.js +202 -0
- package/sdk/dist/namespaces/blobs.js.map +1 -0
- package/sdk/dist/namespaces/blobs.types.d.ts +58 -0
- package/sdk/dist/namespaces/blobs.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/blobs.types.js +9 -0
- package/sdk/dist/namespaces/blobs.types.js.map +1 -0
- package/sdk/dist/namespaces/contracts.d.ts +65 -0
- package/sdk/dist/namespaces/contracts.d.ts.map +1 -0
- package/sdk/dist/namespaces/contracts.js +163 -0
- package/sdk/dist/namespaces/contracts.js.map +1 -0
- package/sdk/dist/namespaces/domains.d.ts +57 -0
- package/sdk/dist/namespaces/domains.d.ts.map +1 -0
- package/sdk/dist/namespaces/domains.js +60 -0
- package/sdk/dist/namespaces/domains.js.map +1 -0
- package/sdk/dist/namespaces/email.d.ts +131 -0
- package/sdk/dist/namespaces/email.d.ts.map +1 -0
- package/sdk/dist/namespaces/email.js +318 -0
- package/sdk/dist/namespaces/email.js.map +1 -0
- package/sdk/dist/namespaces/functions.d.ts +43 -0
- package/sdk/dist/namespaces/functions.d.ts.map +1 -0
- package/sdk/dist/namespaces/functions.js +146 -0
- package/sdk/dist/namespaces/functions.js.map +1 -0
- package/sdk/dist/namespaces/functions.types.d.ts +96 -0
- package/sdk/dist/namespaces/functions.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/functions.types.js +6 -0
- package/sdk/dist/namespaces/functions.types.js.map +1 -0
- package/sdk/dist/namespaces/projects.d.ts +97 -0
- package/sdk/dist/namespaces/projects.d.ts.map +1 -0
- package/sdk/dist/namespaces/projects.js +214 -0
- package/sdk/dist/namespaces/projects.js.map +1 -0
- package/sdk/dist/namespaces/projects.types.d.ts +112 -0
- package/sdk/dist/namespaces/projects.types.d.ts.map +1 -0
- package/sdk/dist/namespaces/projects.types.js +9 -0
- package/sdk/dist/namespaces/projects.types.js.map +1 -0
- package/sdk/dist/namespaces/secrets.d.ts +23 -0
- package/sdk/dist/namespaces/secrets.d.ts.map +1 -0
- package/sdk/dist/namespaces/secrets.js +45 -0
- package/sdk/dist/namespaces/secrets.js.map +1 -0
- package/sdk/dist/namespaces/sender-domain.d.ts +40 -0
- package/sdk/dist/namespaces/sender-domain.d.ts.map +1 -0
- package/sdk/dist/namespaces/sender-domain.js +69 -0
- package/sdk/dist/namespaces/sender-domain.js.map +1 -0
- package/sdk/dist/namespaces/service.d.ts +51 -0
- package/sdk/dist/namespaces/service.d.ts.map +1 -0
- package/sdk/dist/namespaces/service.js +25 -0
- package/sdk/dist/namespaces/service.js.map +1 -0
- package/sdk/dist/namespaces/sites.d.ts +50 -0
- package/sdk/dist/namespaces/sites.d.ts.map +1 -0
- package/sdk/dist/namespaces/sites.js +38 -0
- package/sdk/dist/namespaces/sites.js.map +1 -0
- package/sdk/dist/namespaces/subdomains.d.ts +36 -0
- package/sdk/dist/namespaces/subdomains.d.ts.map +1 -0
- package/sdk/dist/namespaces/subdomains.js +54 -0
- package/sdk/dist/namespaces/subdomains.js.map +1 -0
- package/sdk/dist/namespaces/tier.d.ts +36 -0
- package/sdk/dist/namespaces/tier.d.ts.map +1 -0
- package/sdk/dist/namespaces/tier.js +31 -0
- package/sdk/dist/namespaces/tier.js.map +1 -0
- package/sdk/dist/node/credentials.d.ts +26 -0
- package/sdk/dist/node/credentials.d.ts.map +1 -0
- package/sdk/dist/node/credentials.js +69 -0
- package/sdk/dist/node/credentials.js.map +1 -0
- package/sdk/dist/node/index.d.ts +44 -0
- package/sdk/dist/node/index.d.ts.map +1 -0
- package/sdk/dist/node/index.js +43 -0
- package/sdk/dist/node/index.js.map +1 -0
- package/sdk/dist/node/paid-fetch.d.ts +22 -0
- package/sdk/dist/node/paid-fetch.d.ts.map +1 -0
- package/sdk/dist/node/paid-fetch.js +116 -0
- package/sdk/dist/node/paid-fetch.js.map +1 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `projects` namespace — project lifecycle, introspection, and admin.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - remote: provision, delete, list, getUsage, getSchema, setupRls, pin, getQuote
|
|
6
|
+
* - local: info, keys, use (require provider support for persistence methods)
|
|
7
|
+
*/
|
|
8
|
+
import type { Client } from "../kernel.js";
|
|
9
|
+
import type { ProjectKeys } from "../credentials.js";
|
|
10
|
+
import type { ListProjectsResult, PinResult, ProjectInfo, ProvisionOptions, ProvisionResult, QuoteResult, RlsSetupOptions, RlsSetupResult, SchemaReport, UsageReport } from "./projects.types.js";
|
|
11
|
+
export declare class Projects {
|
|
12
|
+
private readonly client;
|
|
13
|
+
constructor(client: Client);
|
|
14
|
+
/**
|
|
15
|
+
* Provision a new Postgres project. Requires allowance auth; payment
|
|
16
|
+
* flows through the configured fetch wrapper (x402 in Node, session
|
|
17
|
+
* budget in sandbox). Returned keys are persisted to the local store
|
|
18
|
+
* when the credential provider supports it.
|
|
19
|
+
*
|
|
20
|
+
* @throws {PaymentRequired} when the wallet has insufficient balance and
|
|
21
|
+
* the fetch wrapper cannot sign the 402 retry.
|
|
22
|
+
*/
|
|
23
|
+
provision(opts?: ProvisionOptions): Promise<ProvisionResult>;
|
|
24
|
+
/**
|
|
25
|
+
* Immediately and irreversibly delete a project. Triggers the full
|
|
26
|
+
* destructive cascade (drop tenant schema, delete Lambda functions,
|
|
27
|
+
* release subdomains, tombstone mailbox, wipe secrets). Local keystore
|
|
28
|
+
* is cleaned via the credential provider when supported.
|
|
29
|
+
*
|
|
30
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
31
|
+
*/
|
|
32
|
+
delete(id: string): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* List active projects for a wallet address. Public endpoint — no auth
|
|
35
|
+
* required, no payment.
|
|
36
|
+
*/
|
|
37
|
+
list(wallet: string): Promise<ListProjectsResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Get usage metrics for a project — API calls, storage, tier limits,
|
|
40
|
+
* lease expiry.
|
|
41
|
+
*/
|
|
42
|
+
getUsage(id: string): Promise<UsageReport>;
|
|
43
|
+
/**
|
|
44
|
+
* Introspect the project's database schema — tables, columns, types,
|
|
45
|
+
* constraints, and RLS policies.
|
|
46
|
+
*/
|
|
47
|
+
getSchema(id: string): Promise<SchemaReport>;
|
|
48
|
+
/**
|
|
49
|
+
* Apply a row-level-security template to one or more tables.
|
|
50
|
+
*
|
|
51
|
+
* ⚠ The gateway endpoint is deprecated (sunset 2026-05-23). Prefer the
|
|
52
|
+
* manifest-based `apply_expose` flow for new code.
|
|
53
|
+
*
|
|
54
|
+
* @throws {Run402Error} with `context: "setting up RLS"` when
|
|
55
|
+
* `i_understand_this_is_unrestricted` is missing for the
|
|
56
|
+
* `public_read_write_UNRESTRICTED` template.
|
|
57
|
+
*/
|
|
58
|
+
setupRls(id: string, opts: RlsSetupOptions): Promise<RlsSetupResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Pin a project so it is not garbage-collected or expired. Requires
|
|
61
|
+
* admin-level credentials (operator-only in production).
|
|
62
|
+
*/
|
|
63
|
+
pin(id: string): Promise<PinResult>;
|
|
64
|
+
/**
|
|
65
|
+
* Get tier pricing — prices, lease durations, storage limits, API-call
|
|
66
|
+
* limits. Public, no auth, no payment.
|
|
67
|
+
*/
|
|
68
|
+
getQuote(): Promise<QuoteResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Inspect a project from local state. Combines the project id with the
|
|
71
|
+
* stored keys. Does not make an API call.
|
|
72
|
+
*
|
|
73
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
74
|
+
*/
|
|
75
|
+
info(id: string): Promise<ProjectInfo>;
|
|
76
|
+
/**
|
|
77
|
+
* Return the stored anon/service keys for a project from local state.
|
|
78
|
+
* Does not make an API call.
|
|
79
|
+
*
|
|
80
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
81
|
+
*/
|
|
82
|
+
keys(id: string): Promise<ProjectKeys>;
|
|
83
|
+
/**
|
|
84
|
+
* Set the active/default project in local state. Requires the credential
|
|
85
|
+
* provider to support `setActiveProject`.
|
|
86
|
+
*
|
|
87
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
88
|
+
* @throws {Error} if the provider does not support active-project state.
|
|
89
|
+
*/
|
|
90
|
+
use(id: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Return the active/default project id in local state, or null when none
|
|
93
|
+
* is set or the provider does not track active-project state.
|
|
94
|
+
*/
|
|
95
|
+
active(): Promise<string | null>;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/namespaces/projects.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,KAAK,EACV,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,eAAe,EACf,WAAW,EACX,eAAe,EACf,cAAc,EACd,YAAY,EACZ,WAAW,EACZ,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;;;;;;;OAQG;IACG,SAAS,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,eAAe,CAAC;IAyBtE;;;;;;;OAOG;IACG,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvC;;;OAGG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQvD;;;OAGG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAUhD;;;OAGG;IACG,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAUlD;;;;;;;;;OASG;IACG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;IAgC1E;;;OAGG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAWzC;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC;IAOtC;;;;;OAKG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAM5C;;;;;OAKG;IACG,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAM5C;;;;;;OAMG;IACG,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAapC;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAKvC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `projects` namespace — project lifecycle, introspection, and admin.
|
|
3
|
+
*
|
|
4
|
+
* Covers:
|
|
5
|
+
* - remote: provision, delete, list, getUsage, getSchema, setupRls, pin, getQuote
|
|
6
|
+
* - local: info, keys, use (require provider support for persistence methods)
|
|
7
|
+
*/
|
|
8
|
+
import { ProjectNotFound, Run402Error } from "../errors.js";
|
|
9
|
+
export class Projects {
|
|
10
|
+
client;
|
|
11
|
+
constructor(client) {
|
|
12
|
+
this.client = client;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Provision a new Postgres project. Requires allowance auth; payment
|
|
16
|
+
* flows through the configured fetch wrapper (x402 in Node, session
|
|
17
|
+
* budget in sandbox). Returned keys are persisted to the local store
|
|
18
|
+
* when the credential provider supports it.
|
|
19
|
+
*
|
|
20
|
+
* @throws {PaymentRequired} when the wallet has insufficient balance and
|
|
21
|
+
* the fetch wrapper cannot sign the 402 retry.
|
|
22
|
+
*/
|
|
23
|
+
async provision(opts = {}) {
|
|
24
|
+
const body = {};
|
|
25
|
+
if (opts.tier !== undefined)
|
|
26
|
+
body.tier = opts.tier;
|
|
27
|
+
if (opts.name !== undefined)
|
|
28
|
+
body.name = opts.name;
|
|
29
|
+
const result = await this.client.request("/projects/v1", {
|
|
30
|
+
method: "POST",
|
|
31
|
+
body,
|
|
32
|
+
context: "provisioning project",
|
|
33
|
+
});
|
|
34
|
+
// Persist the new project and set it active, if the provider supports it.
|
|
35
|
+
const creds = this.client.credentials;
|
|
36
|
+
if (creds.saveProject) {
|
|
37
|
+
await creds.saveProject(result.project_id, {
|
|
38
|
+
anon_key: result.anon_key,
|
|
39
|
+
service_key: result.service_key,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (creds.setActiveProject) {
|
|
43
|
+
await creds.setActiveProject(result.project_id);
|
|
44
|
+
}
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Immediately and irreversibly delete a project. Triggers the full
|
|
49
|
+
* destructive cascade (drop tenant schema, delete Lambda functions,
|
|
50
|
+
* release subdomains, tombstone mailbox, wipe secrets). Local keystore
|
|
51
|
+
* is cleaned via the credential provider when supported.
|
|
52
|
+
*
|
|
53
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
54
|
+
*/
|
|
55
|
+
async delete(id) {
|
|
56
|
+
const keys = await this.client.getProject(id);
|
|
57
|
+
if (!keys)
|
|
58
|
+
throw new ProjectNotFound(id, "deleting project");
|
|
59
|
+
await this.client.request(`/projects/v1/${id}`, {
|
|
60
|
+
method: "DELETE",
|
|
61
|
+
headers: { Authorization: `Bearer ${keys.service_key}` },
|
|
62
|
+
context: "deleting project",
|
|
63
|
+
});
|
|
64
|
+
const creds = this.client.credentials;
|
|
65
|
+
if (creds.removeProject)
|
|
66
|
+
await creds.removeProject(id);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List active projects for a wallet address. Public endpoint — no auth
|
|
70
|
+
* required, no payment.
|
|
71
|
+
*/
|
|
72
|
+
async list(wallet) {
|
|
73
|
+
const w = wallet.toLowerCase();
|
|
74
|
+
return this.client.request(`/wallets/v1/${w}/projects`, {
|
|
75
|
+
context: "listing projects",
|
|
76
|
+
withAuth: false,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get usage metrics for a project — API calls, storage, tier limits,
|
|
81
|
+
* lease expiry.
|
|
82
|
+
*/
|
|
83
|
+
async getUsage(id) {
|
|
84
|
+
const keys = await this.client.getProject(id);
|
|
85
|
+
if (!keys)
|
|
86
|
+
throw new ProjectNotFound(id, "fetching usage");
|
|
87
|
+
return this.client.request(`/projects/v1/admin/${id}/usage`, {
|
|
88
|
+
headers: { Authorization: `Bearer ${keys.service_key}` },
|
|
89
|
+
context: "fetching usage",
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Introspect the project's database schema — tables, columns, types,
|
|
94
|
+
* constraints, and RLS policies.
|
|
95
|
+
*/
|
|
96
|
+
async getSchema(id) {
|
|
97
|
+
const keys = await this.client.getProject(id);
|
|
98
|
+
if (!keys)
|
|
99
|
+
throw new ProjectNotFound(id, "fetching schema");
|
|
100
|
+
return this.client.request(`/projects/v1/admin/${id}/schema`, {
|
|
101
|
+
headers: { Authorization: `Bearer ${keys.service_key}` },
|
|
102
|
+
context: "fetching schema",
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Apply a row-level-security template to one or more tables.
|
|
107
|
+
*
|
|
108
|
+
* ⚠ The gateway endpoint is deprecated (sunset 2026-05-23). Prefer the
|
|
109
|
+
* manifest-based `apply_expose` flow for new code.
|
|
110
|
+
*
|
|
111
|
+
* @throws {Run402Error} with `context: "setting up RLS"` when
|
|
112
|
+
* `i_understand_this_is_unrestricted` is missing for the
|
|
113
|
+
* `public_read_write_UNRESTRICTED` template.
|
|
114
|
+
*/
|
|
115
|
+
async setupRls(id, opts) {
|
|
116
|
+
if (opts.template === "public_read_write_UNRESTRICTED" &&
|
|
117
|
+
opts.i_understand_this_is_unrestricted !== true) {
|
|
118
|
+
throw new (class extends Run402Error {
|
|
119
|
+
})("i_understand_this_is_unrestricted must be true when template is public_read_write_UNRESTRICTED", null, null, "setting up RLS");
|
|
120
|
+
}
|
|
121
|
+
const keys = await this.client.getProject(id);
|
|
122
|
+
if (!keys)
|
|
123
|
+
throw new ProjectNotFound(id, "setting up RLS");
|
|
124
|
+
const body = {
|
|
125
|
+
template: opts.template,
|
|
126
|
+
tables: opts.tables,
|
|
127
|
+
};
|
|
128
|
+
if (opts.i_understand_this_is_unrestricted !== undefined) {
|
|
129
|
+
body.i_understand_this_is_unrestricted = opts.i_understand_this_is_unrestricted;
|
|
130
|
+
}
|
|
131
|
+
return this.client.request(`/projects/v1/admin/${id}/rls`, {
|
|
132
|
+
method: "POST",
|
|
133
|
+
headers: { Authorization: `Bearer ${keys.service_key}` },
|
|
134
|
+
body,
|
|
135
|
+
context: "setting up RLS",
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Pin a project so it is not garbage-collected or expired. Requires
|
|
140
|
+
* admin-level credentials (operator-only in production).
|
|
141
|
+
*/
|
|
142
|
+
async pin(id) {
|
|
143
|
+
const keys = await this.client.getProject(id);
|
|
144
|
+
if (!keys)
|
|
145
|
+
throw new ProjectNotFound(id, "pinning project");
|
|
146
|
+
return this.client.request(`/projects/v1/admin/${id}/pin`, {
|
|
147
|
+
method: "POST",
|
|
148
|
+
headers: { Authorization: `Bearer ${keys.service_key}` },
|
|
149
|
+
context: "pinning project",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get tier pricing — prices, lease durations, storage limits, API-call
|
|
154
|
+
* limits. Public, no auth, no payment.
|
|
155
|
+
*/
|
|
156
|
+
async getQuote() {
|
|
157
|
+
return this.client.request("/tiers/v1", {
|
|
158
|
+
context: "getting quote",
|
|
159
|
+
withAuth: false,
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Inspect a project from local state. Combines the project id with the
|
|
164
|
+
* stored keys. Does not make an API call.
|
|
165
|
+
*
|
|
166
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
167
|
+
*/
|
|
168
|
+
async info(id) {
|
|
169
|
+
const keys = await this.client.getProject(id);
|
|
170
|
+
if (!keys)
|
|
171
|
+
throw new ProjectNotFound(id, "fetching project info");
|
|
172
|
+
return { project_id: id, ...keys };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Return the stored anon/service keys for a project from local state.
|
|
176
|
+
* Does not make an API call.
|
|
177
|
+
*
|
|
178
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
179
|
+
*/
|
|
180
|
+
async keys(id) {
|
|
181
|
+
const keys = await this.client.getProject(id);
|
|
182
|
+
if (!keys)
|
|
183
|
+
throw new ProjectNotFound(id, "fetching project keys");
|
|
184
|
+
return keys;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Set the active/default project in local state. Requires the credential
|
|
188
|
+
* provider to support `setActiveProject`.
|
|
189
|
+
*
|
|
190
|
+
* @throws {ProjectNotFound} if the id is unknown to the provider.
|
|
191
|
+
* @throws {Error} if the provider does not support active-project state.
|
|
192
|
+
*/
|
|
193
|
+
async use(id) {
|
|
194
|
+
const keys = await this.client.getProject(id);
|
|
195
|
+
if (!keys)
|
|
196
|
+
throw new ProjectNotFound(id, "setting active project");
|
|
197
|
+
const setter = this.client.credentials.setActiveProject;
|
|
198
|
+
if (!setter) {
|
|
199
|
+
throw new Error("This credential provider does not support setActiveProject — `use` is only available with providers that track local active-project state.");
|
|
200
|
+
}
|
|
201
|
+
await setter.call(this.client.credentials, id);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Return the active/default project id in local state, or null when none
|
|
205
|
+
* is set or the provider does not track active-project state.
|
|
206
|
+
*/
|
|
207
|
+
async active() {
|
|
208
|
+
const getter = this.client.credentials.getActiveProject;
|
|
209
|
+
if (!getter)
|
|
210
|
+
return null;
|
|
211
|
+
return getter.call(this.client.credentials);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/namespaces/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request and response types for the `projects` namespace.
|
|
3
|
+
*
|
|
4
|
+
* These types map to the shapes of the run402 API endpoints exposed by
|
|
5
|
+
* the gateway. They are intentionally not re-used from the gateway source
|
|
6
|
+
* (private repo) — the SDK version is the canonical client-side contract.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProjectKeys } from "../credentials.js";
|
|
9
|
+
export type ProjectTier = "prototype" | "hobby" | "team";
|
|
10
|
+
export interface ProvisionOptions {
|
|
11
|
+
/** Tier determines price, lease length, storage, and API-call limits. Default: "prototype". */
|
|
12
|
+
tier?: ProjectTier;
|
|
13
|
+
/** Optional display name. Auto-generated when omitted. */
|
|
14
|
+
name?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ProvisionResult {
|
|
17
|
+
project_id: string;
|
|
18
|
+
anon_key: string;
|
|
19
|
+
service_key: string;
|
|
20
|
+
schema_slot: string;
|
|
21
|
+
}
|
|
22
|
+
export interface ProjectSummary {
|
|
23
|
+
id: string;
|
|
24
|
+
name: string;
|
|
25
|
+
tier: string;
|
|
26
|
+
status: string;
|
|
27
|
+
api_calls: number;
|
|
28
|
+
storage_bytes: number;
|
|
29
|
+
lease_expires_at: string;
|
|
30
|
+
created_at: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ListProjectsResult {
|
|
33
|
+
wallet: string;
|
|
34
|
+
projects: ProjectSummary[];
|
|
35
|
+
}
|
|
36
|
+
export interface UsageReport {
|
|
37
|
+
project_id: string;
|
|
38
|
+
tier: string;
|
|
39
|
+
api_calls: number;
|
|
40
|
+
api_calls_limit: number;
|
|
41
|
+
storage_bytes: number;
|
|
42
|
+
storage_limit_bytes: number;
|
|
43
|
+
lease_expires_at: string;
|
|
44
|
+
status: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ColumnSchema {
|
|
47
|
+
name: string;
|
|
48
|
+
type: string;
|
|
49
|
+
nullable: boolean;
|
|
50
|
+
default_value: string | null;
|
|
51
|
+
}
|
|
52
|
+
export interface ConstraintSchema {
|
|
53
|
+
name: string;
|
|
54
|
+
type: string;
|
|
55
|
+
definition: string;
|
|
56
|
+
}
|
|
57
|
+
export interface RlsPolicy {
|
|
58
|
+
name: string;
|
|
59
|
+
command: string;
|
|
60
|
+
using_expression: string | null;
|
|
61
|
+
check_expression: string | null;
|
|
62
|
+
}
|
|
63
|
+
export interface TableSchema {
|
|
64
|
+
name: string;
|
|
65
|
+
columns: ColumnSchema[];
|
|
66
|
+
constraints: ConstraintSchema[];
|
|
67
|
+
rls_enabled: boolean;
|
|
68
|
+
policies: RlsPolicy[];
|
|
69
|
+
}
|
|
70
|
+
export interface SchemaReport {
|
|
71
|
+
schema: string;
|
|
72
|
+
tables: TableSchema[];
|
|
73
|
+
}
|
|
74
|
+
export type RlsTemplate = "user_owns_rows" | "public_read_authenticated_write" | "public_read_write_UNRESTRICTED";
|
|
75
|
+
export interface RlsTableSpec {
|
|
76
|
+
/** Table name (unqualified — the project's schema is implicit). */
|
|
77
|
+
table: string;
|
|
78
|
+
/** Column holding the owning user's id. Required when `template: "user_owns_rows"`. */
|
|
79
|
+
owner_column?: string;
|
|
80
|
+
}
|
|
81
|
+
export interface RlsSetupOptions {
|
|
82
|
+
template: RlsTemplate;
|
|
83
|
+
tables: RlsTableSpec[];
|
|
84
|
+
/**
|
|
85
|
+
* Required to be `true` when `template: "public_read_write_UNRESTRICTED"`.
|
|
86
|
+
* Acknowledges that the anon key gains INSERT/UPDATE/DELETE on the listed tables.
|
|
87
|
+
*/
|
|
88
|
+
i_understand_this_is_unrestricted?: boolean;
|
|
89
|
+
}
|
|
90
|
+
export interface RlsSetupResult {
|
|
91
|
+
status: string;
|
|
92
|
+
template: string;
|
|
93
|
+
tables: string[];
|
|
94
|
+
}
|
|
95
|
+
export interface PinResult {
|
|
96
|
+
status: string;
|
|
97
|
+
project_id: string;
|
|
98
|
+
message?: string;
|
|
99
|
+
}
|
|
100
|
+
export interface TierQuote {
|
|
101
|
+
price: string;
|
|
102
|
+
lease_days: number;
|
|
103
|
+
storage_mb: number;
|
|
104
|
+
api_calls: number;
|
|
105
|
+
}
|
|
106
|
+
export interface QuoteResult {
|
|
107
|
+
tiers: Record<string, TierQuote>;
|
|
108
|
+
}
|
|
109
|
+
export interface ProjectInfo extends ProjectKeys {
|
|
110
|
+
project_id: string;
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=projects.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.types.d.ts","sourceRoot":"","sources":["../../src/namespaces/projects.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request and response types for the `projects` namespace.
|
|
3
|
+
*
|
|
4
|
+
* These types map to the shapes of the run402 API endpoints exposed by
|
|
5
|
+
* the gateway. They are intentionally not re-used from the gateway source
|
|
6
|
+
* (private repo) — the SDK version is the canonical client-side contract.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=projects.types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.types.js","sourceRoot":"","sources":["../../src/namespaces/projects.types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `secrets` namespace — project-scoped environment variables for functions.
|
|
3
|
+
* All methods require the project's service key.
|
|
4
|
+
*/
|
|
5
|
+
import type { Client } from "../kernel.js";
|
|
6
|
+
export interface SecretSummary {
|
|
7
|
+
key: string;
|
|
8
|
+
value_hash?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface SecretListResult {
|
|
11
|
+
secrets: SecretSummary[];
|
|
12
|
+
}
|
|
13
|
+
export declare class Secrets {
|
|
14
|
+
private readonly client;
|
|
15
|
+
constructor(client: Client);
|
|
16
|
+
/** Set or overwrite a project secret. Injected as `process.env.KEY` in deployed functions. */
|
|
17
|
+
set(projectId: string, key: string, value: string): Promise<void>;
|
|
18
|
+
/** List secret keys for a project. Values are not returned — only key names and short hashes. */
|
|
19
|
+
list(projectId: string): Promise<SecretListResult>;
|
|
20
|
+
/** Delete a secret. */
|
|
21
|
+
delete(projectId: string, key: string): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/namespaces/secrets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,qBAAa,OAAO;IACN,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C,8FAA8F;IACxF,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAevE,iGAAiG;IAC3F,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAaxD,uBAAuB;IACjB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAa5D"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `secrets` namespace — project-scoped environment variables for functions.
|
|
3
|
+
* All methods require the project's service key.
|
|
4
|
+
*/
|
|
5
|
+
import { ProjectNotFound } from "../errors.js";
|
|
6
|
+
export class Secrets {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/** Set or overwrite a project secret. Injected as `process.env.KEY` in deployed functions. */
|
|
12
|
+
async set(projectId, key, value) {
|
|
13
|
+
const project = await this.client.getProject(projectId);
|
|
14
|
+
if (!project)
|
|
15
|
+
throw new ProjectNotFound(projectId, "setting secret");
|
|
16
|
+
await this.client.request(`/projects/v1/admin/${projectId}/secrets`, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
19
|
+
body: { key, value },
|
|
20
|
+
context: "setting secret",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/** List secret keys for a project. Values are not returned — only key names and short hashes. */
|
|
24
|
+
async list(projectId) {
|
|
25
|
+
const project = await this.client.getProject(projectId);
|
|
26
|
+
if (!project)
|
|
27
|
+
throw new ProjectNotFound(projectId, "listing secrets");
|
|
28
|
+
return this.client.request(`/projects/v1/admin/${projectId}/secrets`, {
|
|
29
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
30
|
+
context: "listing secrets",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** Delete a secret. */
|
|
34
|
+
async delete(projectId, key) {
|
|
35
|
+
const project = await this.client.getProject(projectId);
|
|
36
|
+
if (!project)
|
|
37
|
+
throw new ProjectNotFound(projectId, "deleting secret");
|
|
38
|
+
await this.client.request(`/projects/v1/admin/${projectId}/secrets/${encodeURIComponent(key)}`, {
|
|
39
|
+
method: "DELETE",
|
|
40
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
41
|
+
context: "deleting secret",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/namespaces/secrets.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAW/C,MAAM,OAAO,OAAO;IACW;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C,8FAA8F;IAC9F,KAAK,CAAC,GAAG,CAAC,SAAiB,EAAE,GAAW,EAAE,KAAa;QACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAErE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,sBAAsB,SAAS,UAAU,EACzC;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE;YACpB,OAAO,EAAE,gBAAgB;SAC1B,CACF,CAAC;IACJ,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,IAAI,CAAC,SAAiB;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAEtE,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CACxB,sBAAsB,SAAS,UAAU,EACzC;YACE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,iBAAiB;SAC3B,CACF,CAAC;IACJ,CAAC;IAED,uBAAuB;IACvB,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,GAAW;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;QAEtE,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,sBAAsB,SAAS,YAAY,kBAAkB,CAAC,GAAG,CAAC,EAAE,EACpE;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,WAAW,EAAE,EAAE;YAC3D,OAAO,EAAE,iBAAiB;SAC3B,CACF,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `senderDomain` namespace — custom email sending domains with DKIM
|
|
3
|
+
* verification and optional inbound routing.
|
|
4
|
+
*/
|
|
5
|
+
import type { Client } from "../kernel.js";
|
|
6
|
+
export interface DnsRecord {
|
|
7
|
+
type: string;
|
|
8
|
+
name: string;
|
|
9
|
+
value: string;
|
|
10
|
+
}
|
|
11
|
+
export interface SenderDomainRegisterResult {
|
|
12
|
+
domain: string;
|
|
13
|
+
status: string;
|
|
14
|
+
dns_records: DnsRecord[];
|
|
15
|
+
instructions: string;
|
|
16
|
+
}
|
|
17
|
+
export interface SenderDomainStatusResult {
|
|
18
|
+
domain: string | null;
|
|
19
|
+
status?: string;
|
|
20
|
+
verified_at?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface InboundEnableResult {
|
|
23
|
+
status: string;
|
|
24
|
+
mx_record?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare class SenderDomain {
|
|
27
|
+
private readonly client;
|
|
28
|
+
constructor(client: Client);
|
|
29
|
+
/** Register a custom email sending domain. Returns DKIM + SPF/DMARC DNS records. */
|
|
30
|
+
register(projectId: string, domain: string): Promise<SenderDomainRegisterResult>;
|
|
31
|
+
/** Get the project's current sender-domain registration state (polls SES). */
|
|
32
|
+
status(projectId: string): Promise<SenderDomainStatusResult>;
|
|
33
|
+
/** Remove the custom sender domain; email reverts to `@mail.run402.com`. */
|
|
34
|
+
remove(projectId: string): Promise<void>;
|
|
35
|
+
/** Enable inbound email on a verified custom sender domain. */
|
|
36
|
+
enableInbound(projectId: string, domain: string): Promise<InboundEnableResult>;
|
|
37
|
+
/** Disable inbound email for a custom sender domain. */
|
|
38
|
+
disableInbound(projectId: string, domain: string): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=sender-domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-domain.d.ts","sourceRoot":"","sources":["../../src/namespaces/sender-domain.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,SAAS,EAAE,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C,oFAAoF;IAC9E,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAYtF,8EAA8E;IACxE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAUlE,4EAA4E;IACtE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9C,+DAA+D;IACzD,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAYpF,wDAAwD;IAClD,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAWvE"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `senderDomain` namespace — custom email sending domains with DKIM
|
|
3
|
+
* verification and optional inbound routing.
|
|
4
|
+
*/
|
|
5
|
+
import { ProjectNotFound } from "../errors.js";
|
|
6
|
+
export class SenderDomain {
|
|
7
|
+
client;
|
|
8
|
+
constructor(client) {
|
|
9
|
+
this.client = client;
|
|
10
|
+
}
|
|
11
|
+
/** Register a custom email sending domain. Returns DKIM + SPF/DMARC DNS records. */
|
|
12
|
+
async register(projectId, domain) {
|
|
13
|
+
const project = await this.client.getProject(projectId);
|
|
14
|
+
if (!project)
|
|
15
|
+
throw new ProjectNotFound(projectId, "registering sender domain");
|
|
16
|
+
return this.client.request("/email/v1/domains", {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
19
|
+
body: { domain },
|
|
20
|
+
context: "registering sender domain",
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
/** Get the project's current sender-domain registration state (polls SES). */
|
|
24
|
+
async status(projectId) {
|
|
25
|
+
const project = await this.client.getProject(projectId);
|
|
26
|
+
if (!project)
|
|
27
|
+
throw new ProjectNotFound(projectId, "checking sender domain status");
|
|
28
|
+
return this.client.request("/email/v1/domains", {
|
|
29
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
30
|
+
context: "checking sender domain status",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/** Remove the custom sender domain; email reverts to `@mail.run402.com`. */
|
|
34
|
+
async remove(projectId) {
|
|
35
|
+
const project = await this.client.getProject(projectId);
|
|
36
|
+
if (!project)
|
|
37
|
+
throw new ProjectNotFound(projectId, "removing sender domain");
|
|
38
|
+
await this.client.request("/email/v1/domains", {
|
|
39
|
+
method: "DELETE",
|
|
40
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
41
|
+
context: "removing sender domain",
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** Enable inbound email on a verified custom sender domain. */
|
|
45
|
+
async enableInbound(projectId, domain) {
|
|
46
|
+
const project = await this.client.getProject(projectId);
|
|
47
|
+
if (!project)
|
|
48
|
+
throw new ProjectNotFound(projectId, "enabling inbound email");
|
|
49
|
+
return this.client.request("/email/v1/domains/inbound", {
|
|
50
|
+
method: "POST",
|
|
51
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
52
|
+
body: { domain },
|
|
53
|
+
context: "enabling inbound email",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/** Disable inbound email for a custom sender domain. */
|
|
57
|
+
async disableInbound(projectId, domain) {
|
|
58
|
+
const project = await this.client.getProject(projectId);
|
|
59
|
+
if (!project)
|
|
60
|
+
throw new ProjectNotFound(projectId, "disabling inbound email");
|
|
61
|
+
await this.client.request("/email/v1/domains/inbound", {
|
|
62
|
+
method: "DELETE",
|
|
63
|
+
headers: { Authorization: `Bearer ${project.service_key}` },
|
|
64
|
+
body: { domain },
|
|
65
|
+
context: "disabling inbound email",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=sender-domain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sender-domain.js","sourceRoot":"","sources":["../../src/namespaces/sender-domain.ts"],"names":[],"mappings":"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"}
|