@amerged/ohmyhost-runtime 0.1.23 → 0.1.25
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 +1 -1
- package/dist/database-kysely.d.ts +5 -0
- package/dist/database-kysely.d.ts.map +1 -0
- package/dist/database-kysely.js +95 -0
- package/dist/database-kysely.js.map +1 -0
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +43 -7
- package/dist/database.js.map +1 -1
- package/dist/errors.d.ts +5 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -5
- package/dist/errors.js.map +1 -1
- package/dist/http.d.ts +4 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +31 -12
- package/dist/http.js.map +1 -1
- package/dist/mail-attachments.d.ts.map +1 -1
- package/dist/mail-attachments.js +3 -4
- package/dist/mail-attachments.js.map +1 -1
- package/dist/mail.d.ts.map +1 -1
- package/dist/mail.js +16 -11
- package/dist/mail.js.map +1 -1
- package/dist/storage-batch-stream.d.ts +31 -0
- package/dist/storage-batch-stream.d.ts.map +1 -0
- package/dist/storage-batch-stream.js +282 -0
- package/dist/storage-batch-stream.js.map +1 -0
- package/dist/storage.d.ts +11 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +167 -14
- package/dist/storage.js.map +1 -1
- package/package.json +13 -1
- package/src/packages/customer-runtime/package.json +53 -0
- package/src/packages/customer-runtime/src/database-kysely.ts +127 -0
- package/src/packages/customer-runtime/{database.ts → src/database.ts} +50 -8
- package/src/packages/customer-runtime/{errors.ts → src/errors.ts} +13 -4
- package/src/packages/customer-runtime/{http.ts → src/http.ts} +43 -10
- package/src/packages/customer-runtime/{mail-attachments.ts → src/mail-attachments.ts} +12 -4
- package/src/packages/customer-runtime/{mail.ts → src/mail.ts} +28 -14
- package/src/packages/customer-runtime/src/storage-batch-stream.ts +318 -0
- package/src/packages/customer-runtime/{storage.ts → src/storage.ts} +236 -13
- /package/src/packages/customer-runtime/{index.ts → src/index.ts} +0 -0
- /package/src/packages/customer-runtime/{mail-webhook.ts → src/mail-webhook.ts} +0 -0
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amerged/ohmyhost-runtime",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.25",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -26,11 +26,23 @@
|
|
|
26
26
|
"types": "./dist/database.d.ts",
|
|
27
27
|
"import": "./dist/database.js"
|
|
28
28
|
},
|
|
29
|
+
"./database-kysely": {
|
|
30
|
+
"types": "./dist/database-kysely.d.ts",
|
|
31
|
+
"import": "./dist/database-kysely.js"
|
|
32
|
+
},
|
|
29
33
|
"./storage": {
|
|
30
34
|
"types": "./dist/storage.d.ts",
|
|
31
35
|
"import": "./dist/storage.js"
|
|
32
36
|
}
|
|
33
37
|
},
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"kysely": "0.29.5"
|
|
40
|
+
},
|
|
41
|
+
"peerDependenciesMeta": {
|
|
42
|
+
"kysely": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
34
46
|
"license": "Apache-2.0",
|
|
35
47
|
"homepage": "https://docs.ohmyho.st/",
|
|
36
48
|
"bugs": {
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ohmyhost/customer-runtime",
|
|
3
|
+
"version": "0.1.25",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"source": "./src/index.ts",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./mail": {
|
|
14
|
+
"source": "./src/mail.ts",
|
|
15
|
+
"types": "./dist/mail.d.ts",
|
|
16
|
+
"import": "./dist/mail.js"
|
|
17
|
+
},
|
|
18
|
+
"./database": {
|
|
19
|
+
"source": "./src/database.ts",
|
|
20
|
+
"types": "./dist/database.d.ts",
|
|
21
|
+
"import": "./dist/database.js"
|
|
22
|
+
},
|
|
23
|
+
"./database-kysely": {
|
|
24
|
+
"source": "./src/database-kysely.ts",
|
|
25
|
+
"types": "./dist/database-kysely.d.ts",
|
|
26
|
+
"import": "./dist/database-kysely.js"
|
|
27
|
+
},
|
|
28
|
+
"./storage": {
|
|
29
|
+
"source": "./src/storage.ts",
|
|
30
|
+
"types": "./dist/storage.d.ts",
|
|
31
|
+
"import": "./dist/storage.js"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "tsc --project tsconfig.build.json",
|
|
36
|
+
"coverage": "vitest run --root ../.. packages/customer-runtime/src --coverage --coverage.include='packages/customer-runtime/src/**/*.ts' --coverage.reporter=text --coverage.reporter=json-summary",
|
|
37
|
+
"test": "vitest run --root ../.. packages/customer-runtime/src",
|
|
38
|
+
"typecheck": "tsc --project tsconfig.json --noEmit"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"kysely": "0.29.5"
|
|
42
|
+
},
|
|
43
|
+
"peerDependenciesMeta": {
|
|
44
|
+
"kysely": {
|
|
45
|
+
"optional": true
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"kysely": "0.29.5",
|
|
50
|
+
"better-auth": "1.7.1"
|
|
51
|
+
},
|
|
52
|
+
"license": "Apache-2.0"
|
|
53
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
PostgresAdapter,
|
|
3
|
+
PostgresIntrospector,
|
|
4
|
+
PostgresQueryCompiler,
|
|
5
|
+
CompiledQuery,
|
|
6
|
+
type DatabaseConnection,
|
|
7
|
+
type Dialect,
|
|
8
|
+
type Driver,
|
|
9
|
+
type Kysely,
|
|
10
|
+
type QueryResult,
|
|
11
|
+
type TransactionSettings,
|
|
12
|
+
} from "kysely";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
createPrivateDatabaseClient,
|
|
16
|
+
type CustomerDatabaseBinding,
|
|
17
|
+
type CustomerDatabaseClient,
|
|
18
|
+
type CustomerDatabaseParameter,
|
|
19
|
+
} from "./database.js";
|
|
20
|
+
|
|
21
|
+
interface Lease {
|
|
22
|
+
readonly release: () => void;
|
|
23
|
+
readonly closed: Promise<void>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Kysely 0.29.5's PostgreSQL compiler and transactions over the private RPC binding. */
|
|
27
|
+
export function createPrivateDatabaseDialect(binding: CustomerDatabaseBinding): Dialect {
|
|
28
|
+
const database = createPrivateDatabaseClient(binding);
|
|
29
|
+
return Object.freeze({
|
|
30
|
+
createAdapter: () => new PostgresAdapter(),
|
|
31
|
+
createQueryCompiler: () => new PostgresQueryCompiler(),
|
|
32
|
+
createIntrospector: (kysely: Kysely<unknown>) => new PostgresIntrospector(kysely),
|
|
33
|
+
createDriver: () => new PrivateDatabaseDriver(database),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class PrivateDatabaseDriver implements Driver {
|
|
38
|
+
readonly #leases = new Map<DatabaseConnection, Lease>();
|
|
39
|
+
readonly #pending = new Set<Promise<void>>();
|
|
40
|
+
#destroyed = false;
|
|
41
|
+
|
|
42
|
+
public async init(): Promise<void> {}
|
|
43
|
+
|
|
44
|
+
public async acquireConnection(): Promise<DatabaseConnection> {
|
|
45
|
+
if (this.#destroyed) throw new TypeError("The private database dialect is destroyed");
|
|
46
|
+
const acquired = Promise.withResolvers<DatabaseConnection>();
|
|
47
|
+
const released = Promise.withResolvers<undefined>();
|
|
48
|
+
const closed = this.database.withConnection(async (held) => {
|
|
49
|
+
if (this.#destroyed) throw new TypeError("The private database dialect is destroyed");
|
|
50
|
+
const connection: DatabaseConnection = Object.freeze({
|
|
51
|
+
executeQuery: async <Row>(query: CompiledQuery): Promise<QueryResult<Row>> => {
|
|
52
|
+
if (!this.#leases.has(connection)) {
|
|
53
|
+
throw new TypeError("The private database connection is released");
|
|
54
|
+
}
|
|
55
|
+
const result = await held.query({
|
|
56
|
+
text: query.sql,
|
|
57
|
+
values: query.parameters as readonly CustomerDatabaseParameter[],
|
|
58
|
+
});
|
|
59
|
+
return {
|
|
60
|
+
rows: [...result.rows] as Row[],
|
|
61
|
+
...(["INSERT", "UPDATE", "DELETE", "MERGE"].includes(result.command) &&
|
|
62
|
+
result.rowCount !== null
|
|
63
|
+
? { numAffectedRows: BigInt(result.rowCount) }
|
|
64
|
+
: {}),
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
streamQuery<Row>(): AsyncIterableIterator<QueryResult<Row>> {
|
|
68
|
+
throw new TypeError("Private database streaming is not supported");
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
this.#leases.set(connection, { release: () => released.resolve(undefined), closed });
|
|
72
|
+
acquired.resolve(connection);
|
|
73
|
+
await released.promise;
|
|
74
|
+
});
|
|
75
|
+
this.#pending.add(closed);
|
|
76
|
+
void closed.then(
|
|
77
|
+
() => {
|
|
78
|
+
this.#pending.delete(closed);
|
|
79
|
+
},
|
|
80
|
+
(error: unknown) => {
|
|
81
|
+
this.#pending.delete(closed);
|
|
82
|
+
acquired.reject(error);
|
|
83
|
+
},
|
|
84
|
+
);
|
|
85
|
+
return acquired.promise;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public async beginTransaction(
|
|
89
|
+
connection: DatabaseConnection,
|
|
90
|
+
settings: TransactionSettings,
|
|
91
|
+
): Promise<void> {
|
|
92
|
+
let text = "begin";
|
|
93
|
+
if (settings.isolationLevel !== undefined || settings.accessMode !== undefined) {
|
|
94
|
+
text = "start transaction";
|
|
95
|
+
if (settings.isolationLevel !== undefined)
|
|
96
|
+
text += ` isolation level ${settings.isolationLevel}`;
|
|
97
|
+
if (settings.accessMode !== undefined) text += ` ${settings.accessMode}`;
|
|
98
|
+
}
|
|
99
|
+
await connection.executeQuery(CompiledQuery.raw(text));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public async commitTransaction(connection: DatabaseConnection): Promise<void> {
|
|
103
|
+
await connection.executeQuery(CompiledQuery.raw("commit"));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
public async rollbackTransaction(connection: DatabaseConnection): Promise<void> {
|
|
107
|
+
await connection.executeQuery(CompiledQuery.raw("rollback"));
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public async releaseConnection(connection: DatabaseConnection): Promise<void> {
|
|
111
|
+
const lease = this.#leases.get(connection);
|
|
112
|
+
if (lease === undefined) return;
|
|
113
|
+
this.#leases.delete(connection);
|
|
114
|
+
lease.release();
|
|
115
|
+
await lease.closed;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public async destroy(): Promise<void> {
|
|
119
|
+
this.#destroyed = true;
|
|
120
|
+
await Promise.all(
|
|
121
|
+
[...this.#leases.keys()].map((connection) => this.releaseConnection(connection)),
|
|
122
|
+
);
|
|
123
|
+
await Promise.allSettled([...this.#pending]);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
public constructor(private readonly database: CustomerDatabaseClient) {}
|
|
127
|
+
}
|
|
@@ -3,6 +3,8 @@ import { CustomerDatabaseError, CustomerRuntimeError } from "./errors.js";
|
|
|
3
3
|
const MAX_QUERY_BYTES = 64 * 1024;
|
|
4
4
|
const MAX_PARAMETERS = 100;
|
|
5
5
|
const MAX_PARAMETER_BYTES = 1024 * 1024;
|
|
6
|
+
const MAX_JSON_PARAMETER_BYTES = 64 * 1024;
|
|
7
|
+
const MAX_KEY_BYTES = 128;
|
|
6
8
|
const MAX_TRANSACTION_QUERIES = 25;
|
|
7
9
|
const MAX_RESULT_ROWS = 1_000;
|
|
8
10
|
const MAX_RESULT_NODES = 10_000;
|
|
@@ -71,7 +73,11 @@ export function createPrivateDatabaseClient(
|
|
|
71
73
|
typeof binding.query !== "function" ||
|
|
72
74
|
typeof binding.transaction !== "function"
|
|
73
75
|
) {
|
|
74
|
-
throw new CustomerRuntimeError(
|
|
76
|
+
throw new CustomerRuntimeError(
|
|
77
|
+
"database_binding_missing",
|
|
78
|
+
false,
|
|
79
|
+
"pass the OHMYHOST_DATABASE binding from the Worker env (Next.js: getCloudflareContext({ async: true }).env), not process.env. It exists only in server code of a deployment whose ohmyhost.yaml sets database.enabled: true.",
|
|
80
|
+
);
|
|
75
81
|
}
|
|
76
82
|
return Object.freeze({
|
|
77
83
|
async withConnection<Result>(
|
|
@@ -164,7 +170,14 @@ function validateQuery(
|
|
|
164
170
|
const budget = aggregateBudget ?? { nodes: 1, bytes: 2 };
|
|
165
171
|
const parsedValues = values.map((parameter, index) => {
|
|
166
172
|
if (index > 0) consume(budget, 1, MAX_PARAMETER_BYTES, invalidQuery);
|
|
167
|
-
|
|
173
|
+
const parsed = validateStructured(parameter, budget, 0, MAX_PARAMETER_BYTES, invalidQuery);
|
|
174
|
+
if (
|
|
175
|
+
(Array.isArray(parsed) ||
|
|
176
|
+
(isRecord(parsed) && !(parsed instanceof Date) && !(parsed instanceof Uint8Array))) &&
|
|
177
|
+
workerJsonParameterBytes(parsed) > MAX_JSON_PARAMETER_BYTES
|
|
178
|
+
)
|
|
179
|
+
invalidQuery();
|
|
180
|
+
return parsed;
|
|
168
181
|
});
|
|
169
182
|
return Object.freeze({
|
|
170
183
|
text,
|
|
@@ -249,14 +262,19 @@ function validateSql(text: string, inConnection = false): void {
|
|
|
249
262
|
.map((statement) => statement.trim())
|
|
250
263
|
.filter((statement) => statement.length > 0);
|
|
251
264
|
const semicolonCount = [...visible].filter((character) => character === ";").length;
|
|
265
|
+
const statement = statements[0] as string;
|
|
252
266
|
if (
|
|
253
267
|
statements.length !== 1 ||
|
|
254
268
|
semicolonCount > 1 ||
|
|
255
269
|
(inConnection
|
|
256
|
-
? // Transaction control is the whole point of holding a connection; session-wide state
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
270
|
+
? // Transaction control is the whole point of holding a connection; session-wide state and a
|
|
271
|
+
// chained transaction, which the database Worker refuses among the first six words, are not.
|
|
272
|
+
/^(?:set|reset|discard|prepare\s+transaction)\b/iu.test(statement) ||
|
|
273
|
+
(/^(?:commit|end|abort|rollback)\b/iu.test(statement) &&
|
|
274
|
+
!/^rollback(?:\s+[a-z_]+)?\s+to\b/iu.test(statement) &&
|
|
275
|
+
/^(?:[a-z_]+\s+){1,5}chain\b/iu.test(statement))
|
|
276
|
+
: /^(?:begin|start(?:\s+transaction)?|commit|end|abort|rollback|savepoint|release|set|reset|discard|prepare)\b/iu.test(
|
|
277
|
+
statement,
|
|
260
278
|
))
|
|
261
279
|
) {
|
|
262
280
|
invalidQuery();
|
|
@@ -364,11 +382,16 @@ function validateStructured(
|
|
|
364
382
|
if (!isRecord(value)) return invalid();
|
|
365
383
|
consume(budget, 2, maximumBytes, invalid);
|
|
366
384
|
// RPC rejects null-prototype objects. The forbidden keys below keep a normal object safe
|
|
367
|
-
// while allowing JSON parameters to cross a real Worker Service Binding.
|
|
385
|
+
// while allowing JSON parameters to cross a real Worker Service Binding. Any other key the
|
|
386
|
+
// database Worker accepts is valid: 1-128 UTF-8 bytes without control characters.
|
|
368
387
|
const output: Record<string, unknown> = {};
|
|
369
388
|
for (const [index, [key, item]] of Object.entries(value).entries()) {
|
|
389
|
+
const keyBytes = new TextEncoder().encode(key).byteLength;
|
|
370
390
|
if (
|
|
371
|
-
|
|
391
|
+
keyBytes < 1 ||
|
|
392
|
+
keyBytes > MAX_KEY_BYTES ||
|
|
393
|
+
// eslint-disable-next-line no-control-regex
|
|
394
|
+
/[\u0000-\u001f\u007f]/u.test(key) ||
|
|
372
395
|
key === "__proto__" ||
|
|
373
396
|
key === "constructor" ||
|
|
374
397
|
key === "prototype"
|
|
@@ -382,6 +405,25 @@ function validateStructured(
|
|
|
382
405
|
return Object.freeze(output);
|
|
383
406
|
}
|
|
384
407
|
|
|
408
|
+
/**
|
|
409
|
+
* The database Worker's own measure of one JSON parameter: text and key bytes, eight bytes per
|
|
410
|
+
* number and 24 per date. Mirroring it lets the client refuse what the Worker would refuse.
|
|
411
|
+
*/
|
|
412
|
+
function workerJsonParameterBytes(value: unknown): number {
|
|
413
|
+
if (typeof value === "string") return new TextEncoder().encode(value).byteLength;
|
|
414
|
+
if (typeof value === "number") return 8;
|
|
415
|
+
if (value instanceof Date) return 24;
|
|
416
|
+
if (value instanceof Uint8Array) return value.byteLength;
|
|
417
|
+
if (Array.isArray(value))
|
|
418
|
+
return value.reduce<number>((total, item) => total + workerJsonParameterBytes(item), 0);
|
|
419
|
+
if (!isRecord(value)) return 0;
|
|
420
|
+
return Object.entries(value).reduce(
|
|
421
|
+
(total, [key, item]) =>
|
|
422
|
+
total + new TextEncoder().encode(key).byteLength + workerJsonParameterBytes(item),
|
|
423
|
+
0,
|
|
424
|
+
);
|
|
425
|
+
}
|
|
426
|
+
|
|
385
427
|
function unavailable(): CustomerRuntimeError {
|
|
386
428
|
return new CustomerRuntimeError("database_unavailable", true);
|
|
387
429
|
}
|
|
@@ -7,12 +7,17 @@ export type CustomerRuntimeGatewayErrorCode =
|
|
|
7
7
|
| "mail_content_expired"
|
|
8
8
|
| "mail_attachment_too_large"
|
|
9
9
|
| "mail_message_not_found"
|
|
10
|
-
| "mail_credit_insufficient"
|
|
11
10
|
| "mail_rejected"
|
|
12
11
|
| "mail_reputation_suspended"
|
|
13
12
|
| "mail_send_conflict"
|
|
14
13
|
| "mail_send_limit_exceeded"
|
|
14
|
+
| "insufficient_organization_credits"
|
|
15
|
+
| "paid_plan_required"
|
|
16
|
+
| "project_budget_exceeded"
|
|
15
17
|
| "storage_conflict"
|
|
18
|
+
| "data_change_in_progress"
|
|
19
|
+
| "storage_binding_data_changed"
|
|
20
|
+
| "storage_delete_pending"
|
|
16
21
|
| "storage_object_not_found"
|
|
17
22
|
| "storage_quota_exceeded"
|
|
18
23
|
| "storage_upload_expired"
|
|
@@ -21,17 +26,20 @@ export type CustomerRuntimeGatewayErrorCode =
|
|
|
21
26
|
|
|
22
27
|
export type CustomerRuntimeErrorCode =
|
|
23
28
|
| CustomerRuntimeGatewayErrorCode
|
|
29
|
+
| "database_binding_missing"
|
|
24
30
|
| "database_query_invalid"
|
|
25
31
|
| "database_response_invalid"
|
|
26
32
|
| "database_unavailable"
|
|
27
33
|
| "scheduled_context_invalid";
|
|
28
34
|
|
|
29
35
|
export class CustomerRuntimeError extends Error {
|
|
36
|
+
/** The message starts with the stable code; a detail names the action, never a secret value. */
|
|
30
37
|
public constructor(
|
|
31
38
|
public readonly code: CustomerRuntimeErrorCode,
|
|
32
39
|
public readonly retryable: boolean,
|
|
40
|
+
detail?: string,
|
|
33
41
|
) {
|
|
34
|
-
super(code);
|
|
42
|
+
super(detail === undefined ? code : `${code}: ${detail}`);
|
|
35
43
|
this.name = "CustomerRuntimeError";
|
|
36
44
|
}
|
|
37
45
|
}
|
|
@@ -41,7 +49,7 @@ export class CustomerDatabaseError extends Error {
|
|
|
41
49
|
public readonly retryable: boolean;
|
|
42
50
|
|
|
43
51
|
public constructor(public readonly code: string) {
|
|
44
|
-
super(
|
|
52
|
+
super(`database_statement_failed: SQLSTATE ${code}`);
|
|
45
53
|
if (!/^[0-9A-Z]{5}$/u.test(code)) throw new TypeError("Invalid SQLSTATE");
|
|
46
54
|
this.name = "CustomerDatabaseError";
|
|
47
55
|
this.retryable = code === "40001" || code === "40P01";
|
|
@@ -53,8 +61,9 @@ export class CustomerRuntimeGatewayError extends CustomerRuntimeError {
|
|
|
53
61
|
code: CustomerRuntimeGatewayErrorCode,
|
|
54
62
|
public readonly status: number | null,
|
|
55
63
|
retryable: boolean,
|
|
64
|
+
detail?: string,
|
|
56
65
|
) {
|
|
57
|
-
super(code, retryable);
|
|
66
|
+
super(code, retryable, detail);
|
|
58
67
|
this.name = "CustomerRuntimeGatewayError";
|
|
59
68
|
}
|
|
60
69
|
}
|
|
@@ -19,27 +19,42 @@ export interface ValidatedGatewayConnection {
|
|
|
19
19
|
|
|
20
20
|
export function validateGatewayConnection(value: GatewayConnection): ValidatedGatewayConnection {
|
|
21
21
|
assertServerRuntime();
|
|
22
|
-
let endpoint: URL;
|
|
22
|
+
let endpoint: URL | null = null;
|
|
23
23
|
try {
|
|
24
24
|
endpoint = new URL(value.endpoint);
|
|
25
25
|
} catch {
|
|
26
|
-
|
|
26
|
+
// Reported below with the option that failed.
|
|
27
27
|
}
|
|
28
|
-
const timeoutMilliseconds = value.timeoutMilliseconds ?? DEFAULT_TIMEOUT_MILLISECONDS;
|
|
29
28
|
if (
|
|
29
|
+
endpoint === null ||
|
|
30
30
|
endpoint.protocol !== "https:" ||
|
|
31
31
|
endpoint.username !== "" ||
|
|
32
32
|
endpoint.password !== "" ||
|
|
33
33
|
endpoint.pathname !== "/" ||
|
|
34
34
|
endpoint.search !== "" ||
|
|
35
|
-
endpoint.hash !== ""
|
|
36
|
-
|
|
37
|
-
|
|
35
|
+
endpoint.hash !== ""
|
|
36
|
+
) {
|
|
37
|
+
configurationInvalid(
|
|
38
|
+
"endpoint is missing or not an https origin; OHMYHOST_MAIL_GATEWAY_URL and OHMYHOST_STORAGE_GATEWAY_URL exist only when ohmyhost.yaml enables that capability",
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
if (typeof value.key !== "string" || !/^[A-Za-z0-9_-]{43}$/u.test(value.key)) {
|
|
42
|
+
configurationInvalid(
|
|
43
|
+
"key is missing or not a runtime capability key; pass OHMYHOST_MAIL_KEY or OHMYHOST_STORAGE_KEY from the Worker env",
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
if (typeof value.fetch !== "function") {
|
|
47
|
+
configurationInvalid(
|
|
48
|
+
"fetch is not a function; pass (request) => env.OHMYHOST_MAIL_GATEWAY.fetch(request) or env.OHMYHOST_STORAGE_GATEWAY.fetch(request)",
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
const timeoutMilliseconds = value.timeoutMilliseconds ?? DEFAULT_TIMEOUT_MILLISECONDS;
|
|
52
|
+
if (
|
|
38
53
|
!Number.isSafeInteger(timeoutMilliseconds) ||
|
|
39
54
|
timeoutMilliseconds < 100 ||
|
|
40
55
|
timeoutMilliseconds > 30_000
|
|
41
56
|
) {
|
|
42
|
-
|
|
57
|
+
configurationInvalid("timeoutMilliseconds must be an integer from 100 to 30000");
|
|
43
58
|
}
|
|
44
59
|
return Object.freeze({
|
|
45
60
|
endpoint: endpoint.href,
|
|
@@ -82,12 +97,13 @@ export async function fetchWithTimeout(
|
|
|
82
97
|
timeoutMilliseconds: number,
|
|
83
98
|
): Promise<Response> {
|
|
84
99
|
const controller = new AbortController();
|
|
100
|
+
const signal = AbortSignal.any([request.signal, controller.signal]);
|
|
85
101
|
const timeout = setTimeout(() => controller.abort(), timeoutMilliseconds);
|
|
86
102
|
try {
|
|
87
|
-
return await fetch(new Request(request, { signal
|
|
103
|
+
return await fetch(new Request(request, { signal }));
|
|
88
104
|
} catch (error) {
|
|
89
105
|
if (error instanceof CustomerRuntimeGatewayError) throw error;
|
|
90
|
-
if (
|
|
106
|
+
if (signal.aborted) {
|
|
91
107
|
throw new CustomerRuntimeGatewayError("gateway_timeout", null, true);
|
|
92
108
|
}
|
|
93
109
|
throw new CustomerRuntimeGatewayError("gateway_unavailable", null, true);
|
|
@@ -111,9 +127,26 @@ export function invalidResponse(): never {
|
|
|
111
127
|
throw new CustomerRuntimeGatewayError("gateway_response_invalid", null, false);
|
|
112
128
|
}
|
|
113
129
|
|
|
130
|
+
/** A malformed platform ID is a configuration mistake, not a gateway answer. */
|
|
131
|
+
export function requireConfiguredUlid(
|
|
132
|
+
value: unknown,
|
|
133
|
+
option: "projectId" | "environmentId",
|
|
134
|
+
variable: "OHMYHOST_PROJECT_ID" | "OHMYHOST_ENVIRONMENT_ID",
|
|
135
|
+
): string {
|
|
136
|
+
if (typeof value !== "string" || !/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/u.test(value)) {
|
|
137
|
+
configurationInvalid(`${option} is not a ULID; pass ${variable} from the Worker env`);
|
|
138
|
+
}
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** Names the failing option and how to supply it; never echoes the configured value. */
|
|
143
|
+
export function configurationInvalid(detail: string): never {
|
|
144
|
+
throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false, detail);
|
|
145
|
+
}
|
|
146
|
+
|
|
114
147
|
function assertServerRuntime(): void {
|
|
115
148
|
if (typeof window !== "undefined") {
|
|
116
|
-
|
|
149
|
+
configurationInvalid("the client runs only in server code, never in a browser");
|
|
117
150
|
}
|
|
118
151
|
}
|
|
119
152
|
|
|
@@ -1,14 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
validateGatewayConnection,
|
|
3
|
+
fetchWithTimeout,
|
|
4
|
+
requireConfiguredUlid,
|
|
5
|
+
type GatewayConnection,
|
|
6
|
+
} from "./http.js";
|
|
2
7
|
import { CustomerRuntimeGatewayError } from "./errors.js";
|
|
3
8
|
/** Stream owned attachments through the private mail binding using the environment's runtime key. */
|
|
4
9
|
export function createMailAttachmentClient(
|
|
5
10
|
configuration: GatewayConnection & { projectId: string },
|
|
6
11
|
) {
|
|
7
12
|
const connection = validateGatewayConnection(configuration);
|
|
8
|
-
|
|
9
|
-
|
|
13
|
+
const projectId = requireConfiguredUlid(
|
|
14
|
+
configuration.projectId,
|
|
15
|
+
"projectId",
|
|
16
|
+
"OHMYHOST_PROJECT_ID",
|
|
17
|
+
);
|
|
10
18
|
const pattern = new RegExp(
|
|
11
|
-
`^/v1/projects/${
|
|
19
|
+
`^/v1/projects/${projectId}/environments/[0-7][0-9A-HJKMNP-TV-Z]{25}/mail/messages/[0-7][0-9A-HJKMNP-TV-Z]{25}/attachments/[A-Za-z0-9_-]{1,128}$`,
|
|
12
20
|
"u",
|
|
13
21
|
);
|
|
14
22
|
return {
|
|
@@ -3,10 +3,20 @@ import {
|
|
|
3
3
|
exactRecord,
|
|
4
4
|
invalidResponse,
|
|
5
5
|
postGatewayJson,
|
|
6
|
+
requireConfiguredUlid,
|
|
6
7
|
validateGatewayConnection,
|
|
7
8
|
type GatewayConnection,
|
|
8
9
|
} from "./http.js";
|
|
9
10
|
|
|
11
|
+
/** The gateway's own payment codes and the action that clears each; none clears on a retry. */
|
|
12
|
+
const PAYMENT_REQUIRED = Object.freeze({
|
|
13
|
+
paid_plan_required:
|
|
14
|
+
"sending mail needs Paid access; the organization Owner starts Paid in billing, and top-ups do not.",
|
|
15
|
+
insufficient_organization_credits: "the organization has no credits for this send; add credits.",
|
|
16
|
+
project_budget_exceeded:
|
|
17
|
+
"this project's Stop budget is used up; raise it or switch it to continue.",
|
|
18
|
+
});
|
|
19
|
+
|
|
10
20
|
export interface TransactionalMailInput {
|
|
11
21
|
readonly from?: string;
|
|
12
22
|
readonly replyTo?: string;
|
|
@@ -32,7 +42,11 @@ export function createTransactionalMailClient(
|
|
|
32
42
|
configuration: GatewayConnection & { readonly projectId: string },
|
|
33
43
|
) {
|
|
34
44
|
const connection = validateGatewayConnection(configuration);
|
|
35
|
-
const projectId =
|
|
45
|
+
const projectId = requireConfiguredUlid(
|
|
46
|
+
configuration.projectId,
|
|
47
|
+
"projectId",
|
|
48
|
+
"OHMYHOST_PROJECT_ID",
|
|
49
|
+
);
|
|
36
50
|
return Object.freeze({
|
|
37
51
|
async send(input: TransactionalMailInput): Promise<TransactionalMailResult> {
|
|
38
52
|
validateMailInput(input);
|
|
@@ -101,19 +115,20 @@ function throwMailError(status: number, body: unknown): never {
|
|
|
101
115
|
);
|
|
102
116
|
const code = record["code"];
|
|
103
117
|
if (record["request_id"] !== undefined) requireUlid(record["request_id"]);
|
|
118
|
+
if (status === 400 && code === "invalid_request") {
|
|
119
|
+
throw new CustomerRuntimeGatewayError("gateway_request_invalid", status, false);
|
|
120
|
+
}
|
|
104
121
|
if (status === 401 && code === "unauthorized") {
|
|
105
122
|
throw new CustomerRuntimeGatewayError("unauthorized", status, false);
|
|
106
123
|
}
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
) {
|
|
116
|
-
throw new CustomerRuntimeGatewayError("mail_credit_insufficient", status, false);
|
|
124
|
+
if (status === 402 && typeof code === "string" && Object.hasOwn(PAYMENT_REQUIRED, code)) {
|
|
125
|
+
const paymentCode = code as keyof typeof PAYMENT_REQUIRED;
|
|
126
|
+
throw new CustomerRuntimeGatewayError(
|
|
127
|
+
paymentCode,
|
|
128
|
+
status,
|
|
129
|
+
false,
|
|
130
|
+
PAYMENT_REQUIRED[paymentCode],
|
|
131
|
+
);
|
|
117
132
|
}
|
|
118
133
|
if (status === 409 && code === "mail_send_conflict") {
|
|
119
134
|
throw new CustomerRuntimeGatewayError("mail_send_conflict", status, false);
|
|
@@ -142,12 +157,11 @@ function validIdempotencyKey(value: string): boolean {
|
|
|
142
157
|
return /^[A-Za-z0-9._:-]{1,128}$/u.test(value);
|
|
143
158
|
}
|
|
144
159
|
|
|
160
|
+
/** The mail provider's own address rule, so the client never refuses what it would send. */
|
|
145
161
|
function validEmail(value: string): boolean {
|
|
146
162
|
return (
|
|
147
163
|
value.length <= 254 &&
|
|
148
|
-
/^[
|
|
149
|
-
value,
|
|
150
|
-
)
|
|
164
|
+
/^[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,63}$/u.test(value)
|
|
151
165
|
);
|
|
152
166
|
}
|
|
153
167
|
|