@amerged/ohmyhost-runtime 0.1.10

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/dist/errors.js ADDED
@@ -0,0 +1,32 @@
1
+ export class CustomerRuntimeError extends Error {
2
+ code;
3
+ retryable;
4
+ constructor(code, retryable) {
5
+ super(code);
6
+ this.code = code;
7
+ this.retryable = retryable;
8
+ this.name = "CustomerRuntimeError";
9
+ }
10
+ }
11
+ /** A verified PostgreSQL statement failure, without SQL, row values or provider diagnostics. */
12
+ export class CustomerDatabaseError extends Error {
13
+ code;
14
+ retryable;
15
+ constructor(code) {
16
+ super("database_statement_failed");
17
+ this.code = code;
18
+ if (!/^[0-9A-Z]{5}$/u.test(code))
19
+ throw new TypeError("Invalid SQLSTATE");
20
+ this.name = "CustomerDatabaseError";
21
+ this.retryable = code === "40001" || code === "40P01";
22
+ }
23
+ }
24
+ export class CustomerRuntimeGatewayError extends CustomerRuntimeError {
25
+ status;
26
+ constructor(code, status, retryable) {
27
+ super(code, retryable);
28
+ this.status = status;
29
+ this.name = "CustomerRuntimeGatewayError";
30
+ }
31
+ }
32
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAE3B;IACA;IAFlB,YACkB,IAA8B,EAC9B,SAAkB;QAElC,KAAK,CAAC,IAAI,CAAC,CAAC;QAHI,SAAI,GAAJ,IAAI,CAA0B;QAC9B,cAAS,GAAT,SAAS,CAAS;QAGlC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,gGAAgG;AAChG,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAGX;IAFnB,SAAS,CAAU;IAEnC,YAAmC,IAAY;QAC7C,KAAK,CAAC,2BAA2B,CAAC,CAAC;QADF,SAAI,GAAJ,IAAI,CAAQ;QAE7C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,kBAAkB,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,OAAO,CAAC;IACxD,CAAC;CACF;AAED,MAAM,OAAO,2BAA4B,SAAQ,oBAAoB;IAGjD;IAFlB,YACE,IAAqC,EACrB,MAAqB,EACrC,SAAkB;QAElB,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAHP,WAAM,GAAN,MAAM,CAAe;QAIrC,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,21 @@
1
+ export interface GatewayConnection {
2
+ readonly endpoint: string;
3
+ readonly key: string;
4
+ readonly fetch: (request: Request) => Promise<Response>;
5
+ readonly timeoutMilliseconds?: number;
6
+ }
7
+ export interface ValidatedGatewayConnection {
8
+ readonly endpoint: string;
9
+ readonly key: string;
10
+ readonly fetch: (request: Request) => Promise<Response>;
11
+ readonly timeoutMilliseconds: number;
12
+ }
13
+ export declare function validateGatewayConnection(value: GatewayConnection): ValidatedGatewayConnection;
14
+ export declare function postGatewayJson(connection: ValidatedGatewayConnection, path: string, body: Readonly<Record<string, unknown>>, maximumRequestBytes: number, idempotencyKey?: string): Promise<{
15
+ readonly status: number;
16
+ readonly body: unknown;
17
+ }>;
18
+ export declare function fetchWithTimeout(fetch: (request: Request) => Promise<Response>, request: Request, timeoutMilliseconds: number): Promise<Response>;
19
+ export declare function exactRecord(value: unknown, keys: readonly string[]): Record<string, unknown>;
20
+ export declare function invalidResponse(): never;
21
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,iBAAiB,GAAG,0BAA0B,CA8B9F;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,0BAA0B,EACtC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,mBAAmB,EAAE,MAAM,EAC3B,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAmB9D;AAED,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,EAC9C,OAAO,EAAE,OAAO,EAChB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,QAAQ,CAAC,CAcnB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAS5F;AAED,wBAAgB,eAAe,IAAI,KAAK,CAEvC"}
package/dist/http.js ADDED
@@ -0,0 +1,105 @@
1
+ import { CustomerRuntimeGatewayError } from "./errors.js";
2
+ const MAX_RESPONSE_BYTES = 32 * 1024;
3
+ const DEFAULT_TIMEOUT_MILLISECONDS = 10_000;
4
+ export function validateGatewayConnection(value) {
5
+ assertServerRuntime();
6
+ let endpoint;
7
+ try {
8
+ endpoint = new URL(value.endpoint);
9
+ }
10
+ catch {
11
+ throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
12
+ }
13
+ const timeoutMilliseconds = value.timeoutMilliseconds ?? DEFAULT_TIMEOUT_MILLISECONDS;
14
+ if (endpoint.protocol !== "https:" ||
15
+ endpoint.username !== "" ||
16
+ endpoint.password !== "" ||
17
+ endpoint.pathname !== "/" ||
18
+ endpoint.search !== "" ||
19
+ endpoint.hash !== "" ||
20
+ !/^[A-Za-z0-9_-]{43}$/u.test(value.key) ||
21
+ typeof value.fetch !== "function" ||
22
+ !Number.isSafeInteger(timeoutMilliseconds) ||
23
+ timeoutMilliseconds < 100 ||
24
+ timeoutMilliseconds > 30_000) {
25
+ throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
26
+ }
27
+ return Object.freeze({
28
+ endpoint: endpoint.href,
29
+ key: value.key,
30
+ fetch: value.fetch,
31
+ timeoutMilliseconds,
32
+ });
33
+ }
34
+ export async function postGatewayJson(connection, path, body, maximumRequestBytes, idempotencyKey) {
35
+ const serializedBody = JSON.stringify(body);
36
+ if (new TextEncoder().encode(serializedBody).byteLength > maximumRequestBytes) {
37
+ throw new CustomerRuntimeGatewayError("gateway_request_invalid", null, false);
38
+ }
39
+ const response = await fetchWithTimeout(connection.fetch, new Request(new URL(path, connection.endpoint), {
40
+ method: "POST",
41
+ headers: {
42
+ authorization: `Bearer ${connection.key}`,
43
+ "content-type": "application/json",
44
+ ...(idempotencyKey === undefined ? {} : { "idempotency-key": idempotencyKey }),
45
+ },
46
+ body: serializedBody,
47
+ }), connection.timeoutMilliseconds);
48
+ return Object.freeze({ status: response.status, body: await readBoundedJson(response) });
49
+ }
50
+ export async function fetchWithTimeout(fetch, request, timeoutMilliseconds) {
51
+ const controller = new AbortController();
52
+ const timeout = setTimeout(() => controller.abort(), timeoutMilliseconds);
53
+ try {
54
+ return await fetch(new Request(request, { signal: controller.signal }));
55
+ }
56
+ catch (error) {
57
+ if (error instanceof CustomerRuntimeGatewayError)
58
+ throw error;
59
+ if (controller.signal.aborted) {
60
+ throw new CustomerRuntimeGatewayError("gateway_timeout", null, true);
61
+ }
62
+ throw new CustomerRuntimeGatewayError("gateway_unavailable", null, true);
63
+ }
64
+ finally {
65
+ clearTimeout(timeout);
66
+ }
67
+ }
68
+ export function exactRecord(value, keys) {
69
+ if (typeof value !== "object" || value === null || Array.isArray(value))
70
+ invalidResponse();
71
+ const record = value;
72
+ const actual = Object.keys(record).sort();
73
+ const expected = [...keys].sort();
74
+ if (actual.length !== expected.length || actual.some((key, index) => key !== expected[index])) {
75
+ invalidResponse();
76
+ }
77
+ return record;
78
+ }
79
+ export function invalidResponse() {
80
+ throw new CustomerRuntimeGatewayError("gateway_response_invalid", null, false);
81
+ }
82
+ function assertServerRuntime() {
83
+ if (typeof window !== "undefined") {
84
+ throw new CustomerRuntimeGatewayError("gateway_configuration_invalid", null, false);
85
+ }
86
+ }
87
+ async function readBoundedJson(response) {
88
+ if (response.headers.get("content-type")?.split(";", 1)[0]?.trim() !== "application/json") {
89
+ invalidResponse();
90
+ }
91
+ const declared = response.headers.get("content-length");
92
+ if (declared !== null && (!/^[0-9]+$/u.test(declared) || Number(declared) > MAX_RESPONSE_BYTES)) {
93
+ invalidResponse();
94
+ }
95
+ const bytes = new Uint8Array(await response.arrayBuffer());
96
+ if (bytes.byteLength > MAX_RESPONSE_BYTES)
97
+ invalidResponse();
98
+ try {
99
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
100
+ }
101
+ catch {
102
+ return invalidResponse();
103
+ }
104
+ }
105
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export * from "./errors.js";
2
+ export * from "./database.js";
3
+ export * from "./mail.js";
4
+ export * from "./storage.js";
5
+ export type { GatewayConnection } from "./http.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./errors.js";
2
+ export * from "./database.js";
3
+ export * from "./mail.js";
4
+ export * from "./storage.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
package/dist/mail.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { type GatewayConnection } from "./http.js";
2
+ export interface TransactionalMailInput {
3
+ readonly idempotencyKey: string;
4
+ readonly to: string;
5
+ readonly subject: string;
6
+ readonly text: string;
7
+ readonly html: string;
8
+ }
9
+ export type TransactionalMailResult = {
10
+ readonly state: "accepted";
11
+ readonly requestId: string;
12
+ readonly messageId: string;
13
+ } | {
14
+ readonly state: "uncertain";
15
+ readonly requestId: string;
16
+ };
17
+ export declare function createTransactionalMailClient(configuration: GatewayConnection & {
18
+ readonly projectId: string;
19
+ }): Readonly<{
20
+ send(input: TransactionalMailInput): Promise<TransactionalMailResult>;
21
+ }>;
22
+ //# sourceMappingURL=mail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.d.ts","sourceRoot":"","sources":["../src/mail.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,uBAAuB,GAC/B;IACE,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,GACD;IACE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEN,wBAAgB,6BAA6B,CAC3C,aAAa,EAAE,iBAAiB,GAAG;IAAE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;gBAK7C,sBAAsB,GAAG,OAAO,CAAC,uBAAuB,CAAC;GAyC9E"}
package/dist/mail.js ADDED
@@ -0,0 +1,102 @@
1
+ import { CustomerRuntimeGatewayError } from "./errors.js";
2
+ import { exactRecord, invalidResponse, postGatewayJson, validateGatewayConnection, } from "./http.js";
3
+ export function createTransactionalMailClient(configuration) {
4
+ const connection = validateGatewayConnection(configuration);
5
+ const projectId = requireUlid(configuration.projectId);
6
+ return Object.freeze({
7
+ async send(input) {
8
+ validateMailInput(input);
9
+ const response = await postGatewayJson(connection, "/v1/send", {
10
+ project_id: projectId,
11
+ to: input.to,
12
+ subject: input.subject,
13
+ text: input.text,
14
+ html: input.html,
15
+ }, 256 * 1024, input.idempotencyKey);
16
+ if (response.status !== 202)
17
+ throwMailError(response.status, response.body);
18
+ const raw = response.body;
19
+ const stateRecord = exactRecord(response.body, raw?.["state"] === "accepted"
20
+ ? ["state", "request_id", "message_id"]
21
+ : ["state", "request_id"]);
22
+ const requestId = requireUlid(stateRecord["request_id"]);
23
+ if (stateRecord["state"] === "uncertain") {
24
+ return Object.freeze({ state: "uncertain", requestId });
25
+ }
26
+ if (stateRecord["state"] !== "accepted" ||
27
+ typeof stateRecord["message_id"] !== "string" ||
28
+ !/^[A-Za-z0-9._-]{1,256}$/u.test(stateRecord["message_id"])) {
29
+ invalidResponse();
30
+ }
31
+ return Object.freeze({
32
+ state: "accepted",
33
+ requestId,
34
+ messageId: stateRecord["message_id"],
35
+ });
36
+ },
37
+ });
38
+ }
39
+ function validateMailInput(input) {
40
+ if (!validIdempotencyKey(input.idempotencyKey) ||
41
+ !validEmail(input.to) ||
42
+ !validContent(input.subject, 200, 998, false) ||
43
+ !validContent(input.text, 65_536, 65_536, true) ||
44
+ !validContent(input.html, 131_072, 131_072, true)) {
45
+ throw new CustomerRuntimeGatewayError("gateway_request_invalid", null, false);
46
+ }
47
+ }
48
+ function throwMailError(status, body) {
49
+ const raw = body;
50
+ const record = exactRecord(body, raw?.["request_id"] === undefined ? ["code"] : ["code", "request_id"]);
51
+ const code = record["code"];
52
+ if (record["request_id"] !== undefined)
53
+ requireUlid(record["request_id"]);
54
+ if (status === 401 && code === "unauthorized") {
55
+ throw new CustomerRuntimeGatewayError("unauthorized", status, false);
56
+ }
57
+ if (status === 402 && code === "mail_send_credit_exhausted") {
58
+ throw new CustomerRuntimeGatewayError("mail_credit_insufficient", status, false);
59
+ }
60
+ if (status === 409 && code === "mail_send_conflict") {
61
+ throw new CustomerRuntimeGatewayError("mail_send_conflict", status, false);
62
+ }
63
+ if (status === 423 && code === "mail_reputation_suspended") {
64
+ throw new CustomerRuntimeGatewayError("mail_reputation_suspended", status, false);
65
+ }
66
+ if (status === 429 && code === "mail_send_daily_limit") {
67
+ throw new CustomerRuntimeGatewayError("mail_send_limit_exceeded", status, true);
68
+ }
69
+ if (status === 502 && code === "mail_rejected") {
70
+ throw new CustomerRuntimeGatewayError("mail_rejected", status, false);
71
+ }
72
+ if (status === 503 && typeof code === "string") {
73
+ throw new CustomerRuntimeGatewayError("gateway_unavailable", status, true);
74
+ }
75
+ return invalidResponse();
76
+ }
77
+ function requireUlid(value) {
78
+ if (typeof value !== "string" || !/^[0-9A-HJKMNP-TV-Z]{26}$/u.test(value))
79
+ invalidResponse();
80
+ return value;
81
+ }
82
+ function validIdempotencyKey(value) {
83
+ return /^[A-Za-z0-9._:-]{1,128}$/u.test(value);
84
+ }
85
+ function validEmail(value) {
86
+ return (value.length <= 254 &&
87
+ /^[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(value));
88
+ }
89
+ function validContent(value, maximumCharacters, maximumBytes, allowLineBreaks) {
90
+ const characters = [...value];
91
+ const invalidControl = characters.some((character) => {
92
+ const code = character.codePointAt(0);
93
+ return (code === undefined ||
94
+ code === 127 ||
95
+ (code < 32 && (!allowLineBreaks || (code !== 9 && code !== 10 && code !== 13))));
96
+ });
97
+ return (characters.length > 0 &&
98
+ characters.length <= maximumCharacters &&
99
+ new TextEncoder().encode(value).byteLength <= maximumBytes &&
100
+ !invalidControl);
101
+ }
102
+ //# sourceMappingURL=mail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mail.js","sourceRoot":"","sources":["../src/mail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { CustomerDatabaseClient } from "./database.js";
2
+ import type { createTransactionalMailClient } from "./mail.js";
3
+ import type { createPrivateStorageClient } from "./storage.js";
4
+ export type ScheduledStorageClient = ReturnType<typeof createPrivateStorageClient>;
5
+ export type ScheduledMailClient = ReturnType<typeof createTransactionalMailClient>;
6
+ export interface ScheduledFunctionContext {
7
+ readonly projectId: string;
8
+ readonly environmentId: string;
9
+ readonly deploymentId: string;
10
+ readonly functionId: string;
11
+ readonly scheduledAt: string;
12
+ readonly idempotencyKey: string;
13
+ readonly signal: AbortSignal;
14
+ readonly database: CustomerDatabaseClient;
15
+ readonly storage: ScheduledStorageClient;
16
+ readonly mail: ScheduledMailClient;
17
+ }
18
+ export type ScheduledFunctionHandler = (context: ScheduledFunctionContext) => Promise<void>;
19
+ export declare function createScheduledFunctionContext(input: ScheduledFunctionContext): ScheduledFunctionContext;
20
+ //# sourceMappingURL=scheduled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled.d.ts","sourceRoot":"","sources":["../src/scheduled.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE/D,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAAC;AACnF,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAEnF,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,sBAAsB,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;CACpC;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE5F,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,wBAAwB,GAC9B,wBAAwB,CA6C1B"}
@@ -0,0 +1,67 @@
1
+ import { CustomerRuntimeError } from "./errors.js";
2
+ export function createScheduledFunctionContext(input) {
3
+ if (typeof input !== "object" ||
4
+ input === null ||
5
+ !validUlid(input.projectId) ||
6
+ !validUlid(input.environmentId) ||
7
+ !validUlid(input.deploymentId) ||
8
+ !/^[a-z][a-z0-9-]{0,62}$/u.test(input.functionId) ||
9
+ !validCanonicalTimestamp(input.scheduledAt) ||
10
+ !/^[A-Za-z0-9._:-]{1,128}$/u.test(input.idempotencyKey) ||
11
+ !(input.signal instanceof AbortSignal) ||
12
+ !hasFunctions(input.database, ["query", "transaction"]) ||
13
+ !hasFunctions(input.storage, [
14
+ "reserveUpload",
15
+ "completeUpload",
16
+ "createSignedRead",
17
+ "deleteObject",
18
+ "upload",
19
+ ]) ||
20
+ !hasFunctions(input.mail, ["send"])) {
21
+ throw new CustomerRuntimeError("scheduled_context_invalid", false);
22
+ }
23
+ const database = bindClient(input.database, ["query", "transaction"]);
24
+ const storage = bindClient(input.storage, [
25
+ "reserveUpload",
26
+ "completeUpload",
27
+ "createSignedRead",
28
+ "deleteObject",
29
+ "upload",
30
+ ]);
31
+ const mail = bindClient(input.mail, ["send"]);
32
+ return Object.freeze({
33
+ projectId: input.projectId,
34
+ environmentId: input.environmentId,
35
+ deploymentId: input.deploymentId,
36
+ functionId: input.functionId,
37
+ scheduledAt: input.scheduledAt,
38
+ idempotencyKey: input.idempotencyKey,
39
+ signal: input.signal,
40
+ database: database,
41
+ storage: storage,
42
+ mail: mail,
43
+ });
44
+ }
45
+ function hasFunctions(value, names) {
46
+ return (typeof value === "object" &&
47
+ value !== null &&
48
+ !Array.isArray(value) &&
49
+ names.every((name) => typeof value[name] === "function"));
50
+ }
51
+ function bindClient(value, names) {
52
+ return Object.freeze(Object.fromEntries(names.map((name) => {
53
+ const method = value[name];
54
+ if (typeof method !== "function") {
55
+ throw new CustomerRuntimeError("scheduled_context_invalid", false);
56
+ }
57
+ return [name, method.bind(value)];
58
+ })));
59
+ }
60
+ function validUlid(value) {
61
+ return /^[0-9A-HJKMNP-TV-Z]{26}$/u.test(value);
62
+ }
63
+ function validCanonicalTimestamp(value) {
64
+ const timestamp = Date.parse(value);
65
+ return Number.isFinite(timestamp) && new Date(timestamp).toISOString() === value;
66
+ }
67
+ //# sourceMappingURL=scheduled.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled.js","sourceRoot":"","sources":["../src/scheduled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { type GatewayConnection } from "./http.js";
2
+ export interface StorageCapability {
3
+ readonly operation: "GET" | "PUT";
4
+ readonly objectKey: string;
5
+ readonly url: string;
6
+ readonly expiresAt: string;
7
+ readonly expectedContentLength: number | null;
8
+ readonly requiredHeaders: Readonly<Record<string, string>>;
9
+ }
10
+ export interface StorageUploadInput {
11
+ readonly idempotencyKey: string;
12
+ readonly objectKey: string;
13
+ readonly contentType: string;
14
+ readonly bytes: Uint8Array;
15
+ }
16
+ export declare function createPrivateStorageClient(configuration: GatewayConnection & {
17
+ readonly projectId: string;
18
+ readonly environmentId: string;
19
+ readonly capabilityFetch: (request: Request) => Promise<Response>;
20
+ }): Readonly<{
21
+ reserveUpload: (input: Omit<StorageUploadInput, "bytes"> & {
22
+ contentLength: number;
23
+ }) => Promise<Readonly<{
24
+ state: "completed";
25
+ transferId: string;
26
+ }> | Readonly<{
27
+ state: "ready";
28
+ transferId: string;
29
+ capability: Readonly<{
30
+ operation: "GET" | "PUT";
31
+ objectKey: string;
32
+ url: string;
33
+ expiresAt: string;
34
+ expectedContentLength: number | null;
35
+ requiredHeaders: Readonly<Record<string, string>>;
36
+ }>;
37
+ }>>;
38
+ completeUpload: (transferId: string) => Promise<Readonly<{
39
+ state: "completed" | "pending";
40
+ transferId: string;
41
+ }>>;
42
+ createSignedRead: (objectKey: string) => Promise<Readonly<{
43
+ operation: "GET" | "PUT";
44
+ objectKey: string;
45
+ url: string;
46
+ expiresAt: string;
47
+ expectedContentLength: number | null;
48
+ requiredHeaders: Readonly<Record<string, string>>;
49
+ }>>;
50
+ deleteObject: (input: {
51
+ idempotencyKey: string;
52
+ objectKey: string;
53
+ }) => Promise<Readonly<{
54
+ state: "completed";
55
+ deletionId: string;
56
+ }>>;
57
+ upload: (input: StorageUploadInput) => Promise<Readonly<{
58
+ state: "completed" | "pending";
59
+ transferId: string;
60
+ }>>;
61
+ }>;
62
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,iBAAiB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACnE;2BAYQ,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;iCAoC5B,MAAM;;;;kCAqBL,MAAM;;;;;;;;0BAiBd;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;;;;oBAkBnD,kBAAkB;;;;GAyBhD"}