@amerged/ohmyhost-runtime 0.1.22 → 0.1.24

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 (42) hide show
  1. package/README.md +1 -1
  2. package/dist/database-kysely.d.ts +5 -0
  3. package/dist/database-kysely.d.ts.map +1 -0
  4. package/dist/database-kysely.js +95 -0
  5. package/dist/database-kysely.js.map +1 -0
  6. package/dist/database.d.ts.map +1 -1
  7. package/dist/database.js +43 -7
  8. package/dist/database.js.map +1 -1
  9. package/dist/errors.d.ts +5 -4
  10. package/dist/errors.d.ts.map +1 -1
  11. package/dist/errors.js +6 -5
  12. package/dist/errors.js.map +1 -1
  13. package/dist/http.d.ts +4 -0
  14. package/dist/http.d.ts.map +1 -1
  15. package/dist/http.js +31 -12
  16. package/dist/http.js.map +1 -1
  17. package/dist/mail-attachments.d.ts.map +1 -1
  18. package/dist/mail-attachments.js +3 -4
  19. package/dist/mail-attachments.js.map +1 -1
  20. package/dist/mail.d.ts.map +1 -1
  21. package/dist/mail.js +16 -11
  22. package/dist/mail.js.map +1 -1
  23. package/dist/storage-batch-stream.d.ts +31 -0
  24. package/dist/storage-batch-stream.d.ts.map +1 -0
  25. package/dist/storage-batch-stream.js +282 -0
  26. package/dist/storage-batch-stream.js.map +1 -0
  27. package/dist/storage.d.ts +11 -0
  28. package/dist/storage.d.ts.map +1 -1
  29. package/dist/storage.js +167 -14
  30. package/dist/storage.js.map +1 -1
  31. package/package.json +13 -1
  32. package/src/packages/customer-runtime/package.json +53 -0
  33. package/src/packages/customer-runtime/src/database-kysely.ts +127 -0
  34. package/src/packages/customer-runtime/{database.ts → src/database.ts} +50 -8
  35. package/src/packages/customer-runtime/{errors.ts → src/errors.ts} +13 -4
  36. package/src/packages/customer-runtime/{http.ts → src/http.ts} +43 -10
  37. package/src/packages/customer-runtime/{mail-attachments.ts → src/mail-attachments.ts} +12 -4
  38. package/src/packages/customer-runtime/{mail.ts → src/mail.ts} +28 -14
  39. package/src/packages/customer-runtime/src/storage-batch-stream.ts +318 -0
  40. package/src/packages/customer-runtime/{storage.ts → src/storage.ts} +236 -13
  41. /package/src/packages/customer-runtime/{index.ts → src/index.ts} +0 -0
  42. /package/src/packages/customer-runtime/{mail-webhook.ts → src/mail-webhook.ts} +0 -0
@@ -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.22",
3
+ "version": "0.1.24",
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.24",
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("database_query_invalid", false);
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
- return validateStructured(parameter, budget, 0, MAX_PARAMETER_BYTES, invalidQuery);
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 is not.
257
- /^(?:set|reset|discard|prepare\s+transaction)\b/iu.test(statements[0] as string)
258
- : /^(?:begin|start(?:\s+transaction)?|commit|end|abort|rollback|savepoint|release|set|reset|discard|prepare\s+transaction)\b/iu.test(
259
- statements[0] as string,
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
- !/^[A-Za-z_?][A-Za-z0-9_?$ -]{0,127}$/u.test(key) ||
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("database_statement_failed");
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
- throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
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
- !/^[A-Za-z0-9_-]{43}$/u.test(value.key) ||
37
- typeof value.fetch !== "function" ||
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
- throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
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: controller.signal }));
103
+ return await fetch(new Request(request, { signal }));
88
104
  } catch (error) {
89
105
  if (error instanceof CustomerRuntimeGatewayError) throw error;
90
- if (controller.signal.aborted) {
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
- throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
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 { validateGatewayConnection, fetchWithTimeout, type GatewayConnection } from "./http.js";
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
- if (!/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/u.test(configuration.projectId))
9
- throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
13
+ const projectId = requireConfiguredUlid(
14
+ configuration.projectId,
15
+ "projectId",
16
+ "OHMYHOST_PROJECT_ID",
17
+ );
10
18
  const pattern = new RegExp(
11
- `^/v1/projects/${configuration.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}$`,
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 = requireUlid(configuration.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
- status === 402 &&
109
- [
110
- "mail_send_credit_exhausted",
111
- "insufficient_organization_credits",
112
- "paid_plan_required",
113
- "project_budget_exceeded",
114
- ].includes(String(code))
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
- /^[a-z0-9](?:[a-z0-9._%+-]{0,62}[a-z0-9])?@(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/u.test(
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